使用camel启用activemq的优先级

时间:2012-01-16 17:41:51

标签: spring jms apache-camel activemq priority-queue

尝试使用activemq激活优先级后,我被告知尝试使用camel(参见here)。但我无法让它发挥作用,我甚至不确定它应该如何运作。

我在弹簧配置中添加了以下代码:

<camelContext id="camel" xmlns="http://camel.apache.org/schema/spring">
  <route>
    <from uri="jms:queue:myqueue" />
    <resequence>
      <batch-config batchSize="200" batchTimeout="3000" allowDuplicates="true" reverse="true"/>
      <header>JMSPriority</header>
    <to uri="mock:result"/>
    </resequence>
   </route>
</camelContext>

<bean id="jmsConfig" class="org.apache.camel.component.activemq.ActiveMQConfiguration">
  <property name="connectionFactory" ref="pooledConnectionFactory"/>
  <property name="transacted" value="false"/>
  <property name="concurrentConsumers" value="10"/>
</bean>

<bean id="activemq" class="org.apache.camel.component.activemq.ActiveMQComponent">
  <property name="configuration" ref="jmsConfig"/>
</bean>

但是这种配置不起作用(没有订购),我有几个问题:

  • mock:result是什么意思?我在文档中找不到它。
  • 骆驼如何重新排序队列,是在创建消息后还是添加消息时完成的?
  • 它可以独立于spring activemq基本配置吗? (我在这里使用camel ActiveMQComponent)

1 个答案:

答案 0 :(得分:1)

首先,mock端点用于单元测试。您可以使用它来验证是否收到了预期的消息:

MockEndpoint resultEndpoint = context.resolveEndpoint("mock:result", MockEndpoint.class);
resultEndpoint.expectedMessageCount(3);
resultEndpoint.expectedBodiesReceived("firstMessageBody", "secondMessageBody", "thirdMessageBody");
resultEndpoint.message(0).header("foo").isEqualTo("bar"); 

接下来,resequencer旨在根据某些属性(在您的情况下为“JMSPriority”标题)对邮件进行排序,并将在给定的超时期限或批量大小的所有消息中执行此操作(默认情况下,批处理大小为100,超时为1000毫秒)。

长话短说,您可以使用resequencer在发送到队列之前,队列之间或队列与消费者之间对消息(批量)进行排序......