我正在尝试学习 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,
鲍勃