Статьи

Интеграция баз данных и создание сервисов RESTful в EAP с помощью Fuse и CDI

Мы поговорили о том, как начать разработку приложения в 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"); 

Это все, что вам нужно сделать. Вы можете найти весь код проекта здесь.