2

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

我关心的是性能。我每天需要处理至少 100.000 条消息。现在我不想处理垂直或水平扩展(我们不能花更多的钱,直到人们确信这项技术是好的)。

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

我的第一个问题是:这是一个好方法(启动并行线程来消耗队列)吗?

我的第二个问题是:我从阅读 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,

鲍勃

4

2 回答 2

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关于如何保持骆驼运行

于 2013-02-28T05:01:02.340 回答
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

于 2013-03-03T06:17:14.370 回答