В предыдущем посте мы узнали о шаблонах корпоративной интеграции (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 engine org.apache.camel : camel-ftp : 2.10 . 1 - Camel's ftp component org.apache.activemq : activemq-camel : 5.6 . 0 org.apache.activemq : activemq-pool : 5.6 . 0 - Libs required to integrate camel with activemq log4j : log4j : 1.2 . 16 org.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 .