代理 Camel 组件
代理 Camel 组件
自 ActiveMQ Classic 5.9 起可用
在 ActiveMQ Classic 代理中嵌入 Apache Camel 为使用 Camel 的集成能力扩展消息代理提供了极大的灵活性。Apache Camel 路由也因此受益,因为您可以避免与 ActiveMQ Classic 远程连接时的序列化和网络成本 - 如果您使用 activemq 组件。
但是,如果您想改变流经 ActiveMQ Classic 消息代理本身的消息行为,您将仅限于出厂提供的 ActiveMQ Classic 代理 拦截器 集 - 或者开发您自己的 代理插件,然后将其作为 jar 引入 ActiveMQ Classic 代理的类路径中。 broker
Camel 组件让这变得更加容易。它在消息通过代理本身时拦截它们,允许修改和操作它们,然后再将它们持久化到消息存储区或传递给最终消费者。
例如,通过定义一个在代理的 JVM 中运行的 CamelContext, broker
组件可以拦截发布到某个主题的所有消息,然后将其发布到一个队列,并在此过程中更改它们的优先级。
<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>
备注
- 只有在代理组件启动的情况下,代理组件才会在代理中添加一个拦截。因此,代理组件在使用之前不会给运行中的代理增加任何开销,而使用后开销将微不足道。
- 消息在被代理接收后,但在处理(持久化或路由到目的地)之前,会被代理组件拦截。
- 在交换中,
IN
消息是一个CamelMessage
,但也 是一个 JMS 消息(通过 STOMP/MQTT/AMQP 等从 ActiveMQ Classic 路由的消息始终被转换为 JMS 消息)。 - 通配符 可以用于目的地,以拦截来自与通配符匹配的目的地 的消息。
- 在拦截后,您必须显式地将消息发送回代理组件 - 这让您可以选择丢弃某些消息(通过不发送)- 或者,就像上面提到的例子一样 - 将消息重新路由到不同的目的地。
有一个故意的警告,只有被拦截的消息可以发送到 broker
组件。例如,从另一个组件(例如 file
)路由 Camel 消息会导致错误。
已添加到 activemq-broker
包中的额外类,以支持 broker
组件。它们允许在不使用 JMX 的情况下查询运行中的代理的状态。这些类是
- org.apache.activemq.broker.view.MessageBrokerView - 提供了用于检索代理统计信息的方法
- 从
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
。