与ActiveMQ并行处理多条消息

时间:2014-10-31 11:50:40

标签: parallel-processing apache-camel activemq

我想使用简单的Processor / AsyncProcessor作为目标并行处理队列中的消息。处理器每条消息需要一点时间,但每条消息可以单独处理,因此可以同时处理(在健康的边界内)。

我很难找到示例,尤其是关于驼峰路线的xml配置。

到目前为止,我已经定义了一个线程池,路由和处理器:

<threadPool id="smallPool" threadName="MyProcessorThread" poolSize="5" maxPoolSize="50" maxQueueSize="100"/>
<route>
    <from uri="broker:queue:inbox" />
    <threads executorServiceRef="smallPool">
        <to uri="MyProcessor" />
    </threads>
</route>
<bean id="MyProcessor" class="com.example.java.MyProcessor" />

我的处理器看起来像:

public class MyProcessor implements Processor {
    @Override
    public void process(Exchange exchange) throws Exception {
        Message in = exchange.getIn();
        String msg = in.getBody(String.class);      
        System.out.println(msg);
        try {
            Thread.sleep(10 * 1000); // Do something in the background
        } catch (InterruptedException e) {}
        System.out.println("Done!");
    }
}

不幸的是,当我将消息发布到队列时,它们仍然被逐个处理,每个消息延迟10秒(我的&#34;后台任务&#34;)。

有人能指出我使用定义的线程池处理消息的正确方向或解释我做错了吗?

1 个答案:

答案 0 :(得分:5)

您应该使用concurrentConsumers选项,如评论中所述,

<route>
    <from uri="broker:queue:inbox?concurrentConsumers=5" />
    <to uri="MyProcessor" />
</route>

请注意,您还可以设置maxConcurrentConsumers使用最小/最大并发消费者范围,因此Camel会根据负载自动增长/缩小。

的JMS文档中查看更多详细信息