Broker Camel 組件
Broker Camel 組件
自 ActiveMQ Classic 5.9 版本起提供
將 Apache Camel 嵌入 ActiveMQ Classic broker 內部,為擴展訊息 broker 提供了極大的彈性,結合了 Camel 的整合能力。Apache Camel 的路由也有好處,你可以避免遠端連線到 ActiveMQ Classic 的序列化和網路成本 - 如果你使用 activemq 組件。
然而,如果你想改變流經 ActiveMQ Classic 訊息 broker 本身的消息行為,你將僅限於 ActiveMQ Classic broker 提供的 攔截器 - 或開發你自己的 Broker 外掛,然後將其作為 jar 引入 ActiveMQ Classic broker 的類別路徑。 broker
Camel 組件讓這一切變得更容易。它會在訊息流經 broker 本身時攔截訊息,允許它們在被持久化到訊息儲存或傳遞給終端消費者之前被修改和操作。
例如,透過定義一個在 broker 的 JVM 內部執行的 CamelContext,broker
組件可以攔截所有發佈到主題(Topic)的訊息,然後將它們發佈到佇列(Queue),並在過程中更改它們的優先級
<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>
注意事項
- broker 組件只有在啟動時才會在 broker 中加入攔截器 - 因此 broker 組件在被使用之前不會增加任何 broker 的執行負擔 - 即使使用,其負擔也是微不足道的。
- 當訊息被 broker 接收時,broker 組件會攔截訊息 - 但在它們被處理(持久化或路由到目的地)之前。
- Exchange 上的
IN
訊息是一個CamelMessage
,同時也是一個 JMS 訊息(從 STOMP/MQTT/AMQP 等路由到 ActiveMQ Classic 的訊息總是會被轉換成 JMS 訊息)。 - 萬用字元 可以被用在目的地,以攔截來自符合萬用字元的目的地的訊息。
- 在攔截之後,你必須明確地將訊息傳回 broker 組件 - 這允許你刪除選定的訊息(不傳送) - 或者,就像上面的情況一樣,將訊息重新路由到不同的目的地。
不過,有一個故意的警告,只有被攔截的訊息才能被傳送到 broker
組件。例如,從另一個組件(例如 file
)路由 Camel 訊息將導致錯誤。
為了支援 broker
組件,已將額外的類別添加到 activemq-broker
套件中。它們允許在不使用 JMX 的情況下查詢正在執行的 broker 的狀態。這些類別是:
- org.apache.activemq.broker.view.MessageBrokerView - 提供用於檢索 broker 統計資料的方法
- 從
org.apache.activemq.broker.view.MessageBrokerView
- 你可以檢索特定目的地的 org.apache.activemq.broker.view.BrokerDestinationView。
範例
當目的地的佇列深度達到一定限制時如何路由訊息
<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 訊息路由器模式。請注意,在 when
子句中使用了 Spring 表達式語言 spel
。