我正在尝试学习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,
鲍勃
答案 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)
一些事情......
你的路径应该是这样的,请注意maxConcurrentConsumers属性表明多个消费者线程需要从IN队列中提取消息,处理它们并将它们推送到OUT队列,
from("jms:in?maxConcurrentConsumers=10")
.process(new CustomProcessor())
.to("jms:out);
有关详细信息,请参阅http://camel.apache.org/activemq.html