代理 Camel 组件

功能 > 代理 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 的情况下查询运行中的代理的状态。这些类是

示例

当目的地的队列深度达到某个限制时如何路由消息

<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

Apache, ActiveMQ, Apache ActiveMQ、Apache 羽毛徽标和 Apache ActiveMQ 项目徽标是 Apache 软件基金会的商标。版权所有 © 2024,Apache 软件基金会。根据 Apache 许可证 2.0 许可。