Мы поговорили о том, как начать разработку приложения в EAP с использованием Java DSL, и наиболее интересно, как использовать инфраструктуру CDI в JavaEE. И в этом посте мы продолжим этот пример немного дальше, покажем вам, как интегрировать с базами данных и Java-бинами в приложение, создать сервлет и, наконец, настроить веб-сервис RESTful.
Для этого проекта обмена валюты я сохранил обменный курс в базе данных h2. Мы собираемся отобразить полный курс обмена на веб-странице, предоставленной веб-службой restful, и предоставить сервлет, который принимает сумму денег и валюту для обмена, отправляет их обратно на сервер, вычисляет и возвращает результат. Итак, вот что я собираюсь сделать
- База данных
- Java Bean
- Servlet
- Restful Web Services
База данных
Конечно, мы хотим использовать источники данных в EAP. Итак, во-первых, создайте источник данных в EAP. Убедитесь, что вы запустили JBoss EAP. Перейдите к Конфигурации, выберите Соединитель, а затем к источникам данных.
- Имя: MyCamelDS
- Имя JNDI: java: jboss / datasources / MyCamelDS
Выберите драйвер, который мы будем использовать, и это h2 в этом случае,
Введите
- URL соединения: jdbc: h2: файл: ~ / h2 / fuseoneap; AUTO_SERVER = TRUE
- Имя пользователя: sa
- Пароль:
Измените минимальный и максимальный размер пула на 1 и 10. Затем включите источник данных MyCamelDS.
И вот мы, источник данных готов!
Затем мы можем использовать платформу CDI для поиска источника данных в JNDI. Итак, создайте CDI Producer, в CDI он создает объект, который может быть внедрен, и который мы собираемся добавить источником данных в наш верблюжий контекст.
public class DatasourceProducer {
  @Resource(lookup= "java:jboss/datasources/MyCamelDS")
  DataSource dataSource;
  @Produces
  @Named("MyCamelDS")
  public DataSource getDataSource() {
    return dataSource;  
  }
}Вы будете удивлены, насколько легко использовать его в Camel, потому что это сделано. Теперь в нашем классе RouteBuilder мы собираемся выбрать каждый обменный курс в базе данных. Мы собираемся использовать компонент SQL в Camel, предоставить SQL, а затем предоставить имя источника данных, которое мы назвали в создателе, которого мы создали.
Наконец, мы собираемся преобразовать набор результатов в формат JSON, используя встроенные компоненты преобразования в Camel.
  from("direct:getCurrencies").routeId("allcurrencies")
  .to("sql:select * from currencyexchange?dataSource=MyCamelDS")
  .marshal()
  .json(JsonLibrary.Jackson);Это оно!
Java Bean
Во-первых, создайте Java-класс, у которого есть метод, который требует денег и валюты для обмена. А поверх класса поместите аннотацию @Name, это позволит бину, который мы создали, получить доступ через EL. И мы можем найти боб из верблюда.
  @Named("currencyconvertor")
  public class CurrencyConvertor {
    public double convertUSD(double amt, ArrayList<Map<String, Object>> data){
      Double rate = (Double)data.get(0).get("rate");
      return amt*rate;
    }
  }Чтобы использовать его на маршруте Camel, просто используйте компоненты bean в Camel.
from("direct:getCurrency").routeId("covertcurrency")
  .log("Got currency: ${headers.amt} and amt${headers.currency} ")
  .choice()
    .when()
      .header("currency")
      .to("sql:select * from currencyexchange where currencycode = :#currency?dataSource=MyCamelDS")
      .log("exchange rate ====> ${body[0][rate]}")
      .to("bean:currencyconvertor?method=convertUSD(${headers.amt},${body})")
  .otherwise()
    .log("nothing to lookup")
     .transform().constant("nothing to lookup");
Servlet
Нам нужно настроить сервлет, под webapp создать файл WEB-INF / web.xml. Щелкните правой кнопкой мыши по дескриптору развертывания и выберите «Создать заглушку дескриптора развертывания». Это создаст пустой файл web.xml для вас.
Добавьте параметр сервлета в web.xml и опубликуйте его
 <servlet>
    <servlet-name>camel</servlet-name>
    <servlet-class>org.apache.camel.component.servlet.CamelHttpTransportServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>camel</servlet-name>
    <url-pattern>/services/*</url-pattern>
  </servlet-mapping>После этого мы можем использовать компонент Servlet в Camel, он опубликует конечную точку сервлета через сервлет, который мы установили ранее.
    from("servlet:///currency?servletName=camel&matchOnUriPrefix=true")
  .routeId("servletCurrency")
  .to("direct:getCurrency");Restful Web Service
Веб-сервисы Restful также должны иметь настройку CamelHttpTransportServlet, так как мы уже сделали это в Servlet, все, что нам нужно сделать, — это построить конечные точки Rest в качестве потребителей в Rest DSL. А затем настройте его на сервлет.
  restConfiguration().component("servlet")
      .contextPath("/camel").port(8080).bindingMode(RestBindingMode.json);
  rest("/currenciesrest")
      .get()
      .produces(MediaType.APPLICATION_JSON)
      .to("direct:getCurrencies"); Это все, что вам нужно сделать. Вы можете найти весь код проекта здесь.





