Встраивание Apache Camel в брокер ActiveMQ обеспечивает большую гибкость для расширения брокера сообщений с помощью возможностей интеграции Camel. Маршруты Apache Camel также выигрывают в том, что вы можете избежать сериализации и сетевых затрат при удаленном подключении к ActiveMQ — если вы используете компонент activemq . Одна из замечательных особенностей Apache ActiveMQ — это то, что он так хорошо работает с Apache Camel .
Однако, если вы хотите изменить поведение сообщений, проходящих через самого брокера сообщений ActiveMQ, вы будете ограничены поставляемым набором перехватчиков ActiveMQ Broker — или разработаете свой собственный плагин Broker — и затем представите его в качестве банального пути к пути к классам. для брокера ActiveMQ.
Однако было бы действительно полезно объединить Interceptors и Camel, упрощая настройку брокеров-перехватчиков с использованием маршрутов Camel, и это именно то, что мы сделали для предстоящего выпуска ActiveMQ 5.9 с компонентом Camel брокера . Вы можете включить файл camel.xml в конфигурацию вашего брокера ActiveMQ, а затем, если вы хотите взять все сообщения, отправленные в очередь, и опубликовать их в теме, изменяя их приоритет по пути, — вы можете сделать что-то вроде этого:
|
1
2
3
4
5
6
7
|
<route id="setPriority"> <from uri="broker:topic:test.broker.>"/> <setHeader headerName="JMSPriority"> <constant>9</constant> </setHeader> <to uri="broker:queue:test.broker.component.queue"/></route> |
Несколько вещей, на которые стоит обратить внимание:
- Компонент посредника добавляет перехват в посредник только в том случае, если он запущен, поэтому компонент посредника не будет добавлять никаких накладных расходов работающему посреднику до тех пор, пока он не будет использован, и тогда издержки будут тривиальными.
- Вы перехватываете сообщения, используя компонент посредника, когда они были получены посредником, но до того, как они будут обработаны (сохранены или направлены в пункт назначения).
- Входящее сообщение на CamelExchange является верблюжьим сообщением, но также является сообщением JMS (сообщения, маршрутизируемые через ActiveMQ из Stomp / MQTT / AMQP и т. Д., Всегда преобразуются в сообщения JMS).
- Вы можете использовать подстановочные знаки в месте назначения, чтобы перехватывать сообщения от мест назначения, соответствующих подстановочному знаку.
- После перехвата вы должны явно отправить сообщение обратно компоненту-посреднику — это позволяет вам либо отбросить выбранные сообщения (не отправляя), либо, как в вышеописанном случае, перенаправить сообщение в другое место назначения.
- Однако есть одно преднамеренное предупреждение: вы можете отправлять только сообщения компоненту-посреднику, которые были перехвачены, то есть маршрутизация сообщения Camel от другого компонента (например, файла) может привести к ошибке.
Есть несколько дополнительных классов, которые были добавлены в пакет activemq-broker — чтобы включить представления работающего брокера без использования JMX — и для поддержки использования компонента брокера:
org.apache.activemq.broker.view.MessageBrokerView — предоставляет методы для получения статистики по брокеру, а из MessageBrokerView — вы можете получить org.apache.activemq.broker.view.BrokerDestinationView для определенного места назначения. Это означает, что вы можете добавить гибкую маршрутизацию внутри брокера, выполнив что-то вроде следующего — для маршрутизации сообщений, когда глубина очереди назначения достигает определенного предела:
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
|
<route id="routeAboveQueueLimitTest"> <from uri="broker:queue:test.broker.queue"/> <choice> <when> <spel>#{@destinationView.queueSize >= 100}</spel> <to uri="broker:queue:test.broker.processLater"/> </when> <otherwise> <to uri="broker:queue:test.broker.queue"/> </otherwise> </choice> </route> </camelContext> <bean id="brokerView" class="org.apache.activemq.broker.view.MessageBrokerView"> <constructor-arg value="testBroker"/> </bean> <bean id="destinationView" factory-bean="brokerView" factory-method="getDestinationView"> <constructor-arg value="test.broker.component.route"/> </bean> |
Это использует шаблон Camel Message Router — обратите внимание на использование языка выражений Spring ( spel ) в предложении when .