JMS队列轮询示例

3
我正在尝试学习activemq + camel以便在实际应用中使用它。我需要消费消息队列,处理消息并将其移动到另一个队列。 但是我的关注点是性能。我每天需要处理至少10万个消息。现在我不想处理垂直或水平扩展(我们不能花更多的钱,直到人们被说服该技术很好)。因此,我考虑开启几个线程轮询队列,处理和移动消息到其他队列。线程的数量将取决于硬件如何响应不断增加的负载水平。 我的第一个问题是:这种方法(启动并行线程来消费队列)是否可行? 我的第二个问题是:我通过阅读《Camel In Action》开始我的学习。我不知道是否遗漏了什么,但我对如何构建消费者有些困惑。通过调整FtpToJMSExample book示例,我得到了下面的代码。在实际应用中,我将不为每个线程创建连接。我将使用应用服务器(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队列直到它变为空,而不是按时间/周期轮询吗?
谢谢,
Bob
2个回答

3

1

有几件事情...

  • 对于你的问题,“这是一个好的方法吗(启动并行线程来消费队列)?” 绝对是的,这是一种非常常见的设计模式。
  • 只要你的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以获取更多详细信息


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接