В предыдущем посте мы узнали о шаблонах корпоративной интеграции (EIP). Теперь в этом посте мы рассмотрим платформу Apache Camel, которая реализует эти шаблоны.
О верблюде:
Apache Camel — проект с открытым исходным кодом, которому почти 5 лет, и у него большое сообщество пользователей. В основе фреймворка лежит механизм, который выполняет посреднические функции и маршрутизирует сообщения из одной системы в другую. На периферии он имеет множество компонентов, которые позволяют взаимодействовать с системами, использующими различные протоколы (например, FTP (s), RPC, веб-сервисы, HTTP, JMS, REST и т. Д.). Также он обеспечивает легкий для понимания предметно-ориентированный язык в Java, Spring и Scala.
Теперь давайте начнем с верблюда Apache. Мы создадим проект с использованием maven, добавим зависимости для необходимых библиотек верблюдов и напишем наш пример, используя как Java, так и Spring DSL.
Рассмотрим систему, которая принимает два типа заказов; виджет и гаджеты. Заказы поступают в очередь JMS и указываются в формате XML. Инвентаризация гаджетов опрашивает каталог файлов на предмет входящих заказов, пока инвентарь виджетов прослушивает очередь. Мы запускаем XPath для всех поступающих заказов и выясняем, относятся ли они к инвентарю виджетов или гаджетов. Наш вариант использования изображен на следующей диаграмме:
Чтобы начать, просто откройте окно командной строки в каталоге и введите mvn archetype: generate
|
1
|
"c:\myprojects>mvn archetype:generate |
Предполагая, что у нас есть версии maven 2+ и jdk 1.6, также для запуска этого примера нам нужен брокер activemq .
Мы добавим следующие зависимости в pom
|
01
02
03
04
05
06
07
08
09
10
11
12
13
|
org.apache.camel : camel-core : 2.10.1- Lib containing Camel engineorg.apache.camel : camel-ftp : 2.10.1- Camel's ftp componentorg.apache.activemq : activemq-camel : 5.6.0org.apache.activemq : activemq-pool : 5.6.0- Libs required to integrate camel with activemqlog4j : log4j : 1.2.16org.slf4j : slf4j-log4j12 : 1.6.4- Libs for logging |
Полный pom.xml вставлен в эту запись.
Теперь давайте закодируем наш верблюжий маршрут, который должен опрашивать очередь JMS, применять XPath, чтобы выяснить, относится ли заказ к инвентарю гаджета или инвентарю виджета, и затем направить его в каталог FTP или очередь JMS.
Заказы, поступающие в нашу систему, имеют следующую структуру
|
01
02
03
04
05
06
07
08
09
10
11
12
|
<xml version="1.0" encoding="UTF-8"> <order> <product>gadget</product> <lineitems> <item>cdplayer</item> <qty>2</qty> </lineitems> <lineitems> <item>ipod-nano</item> <qty>1</qty> </lineitems></order> |
Значение элемента product указывает, принадлежит ли гаджет или это порядок виджетов. Таким образом, применение ниже XPath для заказов позволит нам решить, куда направить это сообщение ./order/product = ‘gadget’, а затем переслать в каталог FTP, а затем переслать в очередь.
Теперь давайте закодируем маршрут, для этого нужно расширить класс RouteBuilder (org.apache.camel.builder.RouteBuilder) и переопределить его метод configure. Мы назовем наш класс JavaDSLMain и поместим следующий код в его метод configure:
|
1
2
3
4
5
|
from("activemq:queue:NewOrders?brokerURL=tcp://192.168.64.144:61616") .choice().when(xpath("/order/product = 'gadget'")) .to("activemq:queue:GadgetOrders?brokerURL=tcp://192.168.64.144:61616") .otherwise() .to("ftp://192.168.101.3/camel-demo?username=admin&password=admin&binary=true"); |
Сделав это, теперь давайте проанализируем вышеуказанный маршрут. Ключевые слова выше образуют Camel EIP DSL; Цель этого маршрута сводится к следующему:
from : это говорит о том, что получают сообщения от конечной точки, т. е. потребляют , в нашем случае это очередь.
Выбор : это предикат, здесь мы применяем простое правило.
xpath : здесь указано применение xpath к текущему сообщению, результатом xpath является логическое значение.
to : это говорит верблюду поместить сообщение в конечную точку, т.е. производить .
Каждое из этих ключевых слов может принимать некоторые параметры для работы. Например, from принимает параметр конечной точки, из которого следует получать сообщения, в нашем случае это очередь в JMS (activemq) посреднике.
Обратите внимание, что Camel автоматически выполняет преобразование типов для вас, в приведенном выше маршруте объект сообщения преобразуется в DOM перед применением XPath.
Мы также поместим основной метод в этот класс, чтобы быстро проверить это. Внутри основного метода нам нужно создать экземпляр контекста Camel, который будет содержать этот маршрут, и при запуске контекста Camel должен установить маршрут и начать прослушивание очереди NewOrders.
Код, который идет в методе main, выглядит следующим образом:
|
1
2
3
4
5
6
7
8
|
CamelContext camelContext = new DefaultCamelContext();camelContext.addRoutes(new JavaDSLMain());camelContext.start();/* wait indefinitely */Object obj = new Object();synchronized (obj) {obj.wait();} |
Просмотрите эту запись, чтобы получить полный список кодов.
Другой способ использования Camel — использование Spring. Маршруты Camel входят в контекстный файл приложения Spring. Вместо написания кода Java все, что мы используем, это XML для быстрого определения маршрутов. Для этого нам нужно импортировать пространства имен Camel в контекстный файл Spring и использовать
IDE, например Spring Tool Suite, позволяет быстро создавать и писать интеграционные приложения.
Проверьте эту запись в Gist на предмет контекста приложения Spring, демонстрирующего маршрут Camel. Поместите этот файл контекста в папку META-INF / spring, т.е. в нашем проекте maven он находится в папке / src / main / resources / META-INF / spring.
Вверху мы импортировали пространство имен Camel Spring, которое позволяет определять маршрут Camel внутри контекста приложения Spring, кроме того, в нашем файле pom нам нужно добавить зависимость, чтобы включить bean-компонент Spring, который заботится о распознавании и создании экземпляра движка Camel внутри Spring. Добавьте ниже, чтобы включить поддержку Camel для Spring.
|
1
2
3
4
5
|
<dependency><groupId>org.apache.camel</groupId><artifactId>camel-spring</artifactId><version>2.10.1</version> </dependency> |
Camel предоставляет вспомогательный класс (org.apache.camel.spring.Main), который сканирует все контекстные файлы приложения Spring, хранящиеся в
Папка META-INF / spring хранится в classpath. Проверьте эту запись с указанием необходимого кода.
В этом примере мы реализовали шаблон Content Based Router, который проверяет содержимое сообщения для принятия решений о маршрутизации.
Ссылка: Начало работы с Apache Camel от нашего партнера JCG Абхишека Джейна в блоге NS.Infra .
