我正在使用activeMQ来记录某些内容。发件人类的主要代码是这样的:
for (int i = 1; i <= 5; i++) {
TextMessage message = session.createTextMessage("ActiveMq send" + i);
System.out.println("send msg:" + "ActiveMq send" + i);
producer.send(message);
}
然后我使用另一个接收器接收来自发件人的5条消息。
MessageConsumer consumer = session.createConsumer(destination);
while (true) {// loop to receive message
TextMessage message = (TextMessage) consumer.receive();
if (null != message) {
System.out.println("received msg:" + message.getText());
}
}
如果我这样写,我只能收到一条或两条消息,但不能收到5.如果我使用consumer.receive(10000)
,我真的会得到5条消息,但如果发送方发送了数百万条消息怎么办?如何在不丢失的情况下接收它们?
答案 0 :(得分:1)
@Evgeniy是对的 - MessageConsumer.receive()正确的调用,或者你可以使用监听器。
来自ActiveMQ的真实世界经验的另一个提示是它有缺陷。我会尽量不去咆哮,因为这个产品有很多好处。但是我已经运行了几个ActiveMQ服务器超过5年,至少使用了不同的版本,而且我的整个经历是它的功能丰富,并且在小型测试环境中可以正常工作,但是在负载下“在野外”它会做各种奇怪的事情 - 包括丢失消息,存储转发管道随机不起作用,消息被“隐藏”,直到它们在重启后神奇地重新出现。
而我并不是唯一能够体验这一点的人:
你所看到的任何奇怪行为都只是一个错误并非不可能。 (但这也很容易 - 你的设置可能还有其他问题,我们无法从你的帖子中看到。)
答案 1 :(得分:0)
MessageConsumer.receive应该是您所需要的,根据JMS API,它会无限制地阻塞,直到生成消息。另一种方法是为此使用者设置一个侦听器 - MessageConsumer.setMessageListener(MessageListener listener)
答案 2 :(得分:0)
Think you need some codes as follows :
while ((IMessage msg = consumer.receive(2000)) != null) {
// Process your message
}