Встраивание 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 .