将Apache Camel嵌入ActiveMQ代理可以为使用Camel的集成功能扩展消息代理提供极大的灵活性。 Apache Camel路由的另一个好处是,如果使用activemq组件 ,则可以避免远程连接到ActiveMQ的序列化和网络开销。 关于Apache ActiveMQ真正伟大的事情之一是,它与Apache Camel一起运行得很好 。
但是,如果您想更改流经ActiveMQ消息代理本身的消息的行为,则将仅限于附带的ActiveMQ Broker 拦截器集 –或开发自己的Broker插件 –然后将其作为罐子引入类路径中为ActiveMQ经纪人。
但是,真正有用的是将Interceptors和Camel结合在一起,从而使使用Camel路由配置Broker Interceptor更加容易,而这正是我们即将与代理 Camel Component一起发布的ActiveMQ 5.9所做的。 您可以将camel.xml文件包含到ActiveMQ代理配置中 ,然后,如果您希望将所有发送到队列的消息都发送到Queue并将其发布到Topic,并在此过程中更改其优先级,则可以执行以下操作:
<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上的in消息既是Camel消息,也是JMS消息(通过ActiveMQ从Stomp / MQTT / AMQP等途径路由的消息始终转换为JMS消息)。
- 您可以在目标上使用通配符来拦截来自与通配符匹配的目标的邮件。
- 截取之后,您必须将消息显式发送回代理组件–这允许您丢弃选择消息(不发送)–或像上述情况一样–将消息重新路由到其他目标。
- 但是,有一个刻意的警告,您只能将消息发送到已被拦截的代理组件,即,从另一个组件(例如,文件)路由骆驼消息将导致错误。
在activemq-broker软件包中添加了一些额外的类-在不使用JMX的情况下启用正在运行的代理的视图-并支持使用broker组件:
org.apache.activemq.broker.view.MessageBrokerView –提供检索代理统计信息的方法,并从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 Message Router模式-请注意在when子句中使用Spring表达式语言( spel )。
翻译自: https://www.javacodegeeks.com/2013/09/apache-camel-broker-component-for-activemq-5-9.html