我尝试使用ActiveMQ组件(在Spring-Boot内部),但最后却有些怪异 结果。
1-我从SEDA向destinationQueue
发送了2000条消息
这是我的做法:
from("file:G:/highlight").to("seda:warehouse");
// took less than a millisecond to complete
from("seda:warehouse?concurrentConsumers=20").to("activemq:queue:destinationQueue")
// Completion time : 58 seconds
Completion time : 58 seconds
2-现在,我尝试使用destinationQueue
中的这些文件
这就是我要做的:
from("activemq:queue:line1").process(new Processor() {
@Override
public void process(Exchange exchange) throws Exception {
System.out.println(exchange.getIn().getBody(String.class));
}
});
// The completion time : around 1 second!
The completion time : around 1 second!
所以我的问题是:
1-当我将文件发送到队列时,为什么速度非常慢?但是我可以吃那些 消息是如此之快(在此测试中,它快了50倍以上)!
任何帮助都会非常感激:))
答案 0 :(得分:0)
感谢@Alexey-yakunin:)
使用ActiveMQ时,如果目的地是“队列”,则产生消息的速度要快于 队列比从队列消费要慢得多。 这是因为,就像@Alexey-yakunin所说的那样,“将消息发送到ActiveMQ队列时,您将它们放在数据库中。数据库位于硬盘驱动器上(瓶颈)。从数据库中读取数据比写入数据要快。它”。
因此,为了证明这一理论,我进行了以下测试:
(不是将消息发送到queue
,而是将它们发送到topic
,没有任何持久订阅者)
No durable subscribers to the topic == No databse
from("file:G:/highlight").to("activemq:topic:newVersion");
from("activemq:topic:newVersion").process(new Processor() {
@Override
public void process(Exchange exchange) throws Exception {
long time = System.currentTimeMillis();
Date date = new Date(time);
System.out.println(date);
}
});
对于2000 messages
,仅花费3 seconds
即可生成和使用所有消息。
此外,这些也是我在春季启动application.properties
中设置的选项,目的是为了充分利用activemq:
camel.component.activemq.broker-u-r-l=tcp://localhost:61616
// By default it is set to false so make sure you set this to true
camel.component.activemq.use-pooled-connection=true
camel.component.activemq.transacted=false
//Remember, the messages will be lost if the broker crashes or is restarted.
camel.component.activemq.delivery-persistent=false
camel.component.activemq.wait-for-provision-correlation-to-be-updated-thread-sleeping-time=50
还有其他两种选择可以激发您改变它们的价值,但是我发现了它们 最好将它们设置为默认值:
camel.component.activemq.concurrent-consumers
camel.component.activemq.max-concurrent-consumers
仅此而已:))