Статьи

Компонент Apache Camel Broker для ActiveMQ 5.9

Встраивание 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
<camelContext id="camel" trace="false" xmlns="http://camel.apache.org/schema/spring">
   <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 .