为什么activeMQ接收器类无法从发送器类接收所有消息

时间:2013-10-09 04:04:25

标签: java activemq

我正在使用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条消息,但如果发送方发送了数百万条消息怎么办?如何在不丢失的情况下接收它们?

3 个答案:

答案 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 
 }