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