JMS队列轮询示例

时间:2013-02-28 04:19:51

标签: java jms activemq apache-camel

我正在尝试学习activemq + camel以便将其应用于现实世界。我需要使用队列,处理消息并将其移动到另一个队列。

我对表现的关注。我每天至少需要处理100.000条消息。现在我不想处理纵向或横向缩放(我们不能花更多的钱,直到人们确信技术是好的)。

所以,我考虑启动几个线程,它将轮询队列,使用,处理并将消息移动到其他队列。线程数量取决于硬件如何响应增加的负载水平。

我的第一个问题是:这是一个很好的方法(开始使用paralel线程来消耗队列)吗?

我的第二个问题是:我通过阅读Camel In Action开始学习。我不知道我是否遗漏了什么,但我对如何建立消费者感到有些困惑。通过调整FtpToJMSExample书的例子,我发布了下面的代码。在现实世界中,我不会为每个线程创建连接。我将使用应用程序服务器(glassfish)提供的连接池。

public class JMSToJMSExample {
    public static void main(String args[]) throws Exception {
        CamelContext context = new DefaultCamelContext();
        ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("vm://localhost");
        context.addComponent("jms", JmsComponent.jmsComponentAutoAcknowledge(connectionFactory));
        context.addRoutes(new RouteBuilder() {
            public void configure() {
                from("jms:in")
                  .process(new CustomProcessor())
                  .to("jms:out");
} });
        context.start();
        Thread.sleep(10000);
        context.stop();
    }
}

工作正常。但是,这本书称它为“民意调查”解决方案。我期待像while循环这样的东西,所以当队列有消息时,它会继续消耗。好的,这个例子是轮询一个队列,但我对上面例子的观点是,如果我减少了睡眠时间,它将退出而不处理它可能的所有消息。

但无论如何,我认为最好建立一个长时间运行的线程,而不是每次线程唤醒时都要求连接池给我一个连接。

请问,既然我正在学习,你能举例说明如何创建一个线程来轮询jms队列,直到它变空,而不是按时间/周期轮询吗?

TIA,

鲍勃

2 个答案:

答案 0 :(得分:2)

1)使用seda http://camel.apache.org/seda.html进行并发处理

             from("jms:in")
             .to("seda:seda1");

             from("seda:sead1?concurrentConsumers=10")
             .process(new CustomProcessor())
             .to("jms:out");

2)阅读http://camel.apache.org/running-camel-standalone-and-have-it-keep-running.html关于如何保持Camel运行

答案 1 :(得分:0)

一些事情......

  • 对你的问题,“这是一个好方法(启动并行线程来消耗队列)?” 绝对,这是一种非常常见的设计模式
  • 只要您的CamelContext正在运行(您不需要循环或计时器),路线就会继续消耗,请参阅http://camel.apache.org/running-camel-standalone-and-have-it-keep-running.html
  • 你的路径应该是这样的,请注意maxConcurrentConsumers属性表明多个消费者线程需要从IN队列中提取消息,处理它们并将它们推送到OUT队列,

    from("jms:in?maxConcurrentConsumers=10")
    .process(new CustomProcessor())
    .to("jms:out);
    

有关详细信息,请参阅http://camel.apache.org/activemq.html