Статьи

Red Hat JBoss Fuse: интеграция базы данных, Java Bean и Restful Services в EAP, Spring DSL

Мы поговорили о том, как начать разработку приложений в EAP с помощью Spring DSL. Из всех трех способов разработки Camel в EAP это, вероятно, проще всего сделать. И в этом посте мы рассмотрим этот пример немного дальше, покажем, как интегрировать с базами данных, 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.

Как только мы подготовим источник данных, мы сможем использовать его, посмотрев его в нашем Spring Camel DSL.

Добавьте новое пространство имен jee в XML-файл Spring,

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:jee="http://www.springframework.org/schema/jee"
    xsi:schemaLocation="
       http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
       http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd

       http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee.xsd">

Найдите источник данных в JNDI, используя jndi-lookup, предоставленный jee. 

<jee:jndi-lookup id="MyCamelDS" jndi-name="java:jboss/datasources/MyCamelDS"/>

И затем мы можем продолжать использовать источник данных с нашим компонентом SQL, так же, как мы использовали бы его в другом контейнере.

  <route id="allcurrencies">
    <from uri="direct:getCurrencies"/>
    <to uri="sql:select * from currencyexchange?dataSource=MyCamelDS"/>
    <marshal>
      <json library="Jackson"/>
    </marshal>
  </route>

Java Bean

Создайте Java-класс, у которого есть метод, который требует обмена денег и денег.

  public class CurrencyConvertor {
    public double convertUSD(double amt, ArrayList<Map<String, Object>> data){
      Double rate = (Double)data.get(0).get("rate");
      return amt*rate;
    }
  }

В Spring Camel Route, как и в обычном приложении Fuse, связывается Java-бин, который мы создали в контексте.

   <bean id="currencyconvertor" class="com.redhat.demo01.CurrencyConvertor"/>

И вызвать бин связывания с помощью компонента бина. 

  <route id="covertcurrency">
    <from uri="direct:getCurrency"/>
    <log message="Got currency: ${headers.amt} and amt${headers.currency}"/>
    <choice>
      <when>
        <header>currency</header>
        <to uri="sql:select * from currencyexchange where currencycode= :#currency ?dataSource=MyCamelDS"/>
        <log message="exchange rate ====&gt; ${body[0][rate]}"/>
        <bean ref="currencyconvertor" method="convertUSD(${headers.amt},${body})"/>
      </when>
      <otherwise>
        <log message="nothing to lookup"/>
        <transform>
          <constant>nothing to lookup</constant>
        </transform>
      </otherwise>
    </choice>
  </route>

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, он опубликует конечную точку сервлета через сервлет, который мы установили ранее.

  <route id="servletCurrencies">
    <from uri="servlet:/currencies?servletName=camel&amp;matchOnUriPrefix=true"/>
    <to uri="direct:getCurrencies"/>
  </route>

Restful Web Service

Веб-сервисы Restful также должны иметь настройку CamelHttpTransportServlet, так как мы уже сделали это в Servlet, все, что нам нужно сделать, — это построить конечные точки Rest в качестве потребителей в Rest DSL. А затем настройте его на сервлет.

  <restConfiguration component="servlet" bindingMode="json" contextPath="/camel">
      <dataFormatProperty key="prettyPrint" value="true"/>
    </restConfiguration>
    <rest path="/currenciesrest">
      <get uri="/">
        <to uri="direct:getCurrencies"/>
      </get>
    </rest> 

Это все, что вам нужно сделать.