Статьи

Начало работы с Apache Camel

В предыдущем посте мы узнали о шаблонах корпоративной интеграции (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 .