【问题标题】:Consumer receives Single message from receive method in Apache ActiveMQ Artemis消费者从 Apache ActiveMQ Artemis 中的接收方法接收单个消息
【发布时间】:2020-03-07 02:44:23
【问题描述】:

我正在我的项目中实现 Apache ActiveMQ Artemis,它连接到 Artemis 远程服务器。所以我首先决定创建一个包含生产者和消费者的独立项目。

import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.MessageConsumer;
import javax.jms.MessageProducer;
import javax.jms.Queue;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.naming.Context;
import javax.naming.InitialContext;

import org.apache.activemq.artemis.api.jms.ActiveMQJMSClient;
import org.apache.activemq.artemis.utils.UUIDGenerator;

/**
 * A simple JMS Queue example that creates a producer and consumer on a queue and sends then receives a message.
 */
public class QueueExample {

   public static void main(final String[] args) throws Exception {
      Connection connection = null;

   try {

         ConnectionFactory cf = ActiveMQJMSClient.createConnectionFactory("tcp://54.67.23.67:61616",  UUIDGenerator.getInstance().generateStringUUID());
         // Step 4.Create a JMS Connection
         connection = cf.createConnection("test","test123");

         // Step 5. Create a JMS Session
         Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);

         // Step 6. Create a JMS Message Producer
         MessageProducer producer = session.createProducer(null);

         // Step 7. Create a Text Message
         TextMessage message1 = session.createTextMessage("This is a text message1");
         Thread.sleep(1000l);
         TextMessage message2 = session.createTextMessage("This is a text message2");


         System.out.println("Sent message: " + message1.getText());

         System.out.println("Sent message: " + message2.getText());

         Destination destination = session.createQueue("TESTQUEUE");

         // Step 8. Send the Message
         producer.send(destination,message1);
         producer.send(destination,message2);

         // Step 9. Create a JMS Message Consumer
         MessageConsumer messageConsumer = session.createConsumer(destination);

         // Step 10. Start the Connection
         connection.start();

         // Step 11. Receive the message
         TextMessage messageReceived = (TextMessage) messageConsumer.receive(5000);

         System.out.println("Received message: " + messageReceived.getText());
      } finally {
         // Step 12. Be sure to close our JMS resources!
         if (initialContext != null) {
            initialContext.close();
         }
         if (connection != null) {
            connection.close();
         }
      }
   }
}

我从生产者发送消息 2 次,但在消费时我只收到 1 条消息。以下是我收到的输出:

收到

Sent message: This is a text message1
Sent message: This is a text message2
Received message: This is a text message1 

预期

Sent message: This is a text message1
Sent message: This is a text message2
Received message: This is a text message1
Received message: This is a text message2

当我再次运行代码时,我得到了Received message: This is a text message2,但我同时想要消息 Message1 和 Message2。

这里发生了什么?谁能指导我,因为我尝试搜索这个问题但没有找到结果。

我的 Artemis 服务器配置不正确,还是代码有问题?

【问题讨论】:

    标签: java activemq-artemis


    【解决方案1】:

    您正在看到预期的行为。调用 receive 最多会返回 1 条消息。如果您想收到更多消息,您需要多次致电receive - 每条您想收到的消息一次,例如:

    TextMessage messageReceived = (TextMessage) messageConsumer.receive(5000);
    
    System.out.println("Received message: " + messageReceived.getText());
    
    messageReceived = (TextMessage) messageConsumer.receive(5000);
    
    System.out.println("Received message: " + messageReceived.getText());
    

    更多信息请查看the JavaDoc for javax.jms.MessageConsumer.receive(long)

    【讨论】:

    • 即使我使用 on-message-listener 我仍然得到相同的行为
    • MessageListener 实现与您在问题中提供的示例代码完全不同。我建议您使用该代码创建一个新问题。我已经为 this 问题提供了答案。如果正确,请标记为正确,如果不正确,请详细说明原因。
    • 好的,写receive() 2次有效。但我没有明白这背后的原因。如果队列中有 2 条待处理消息,它应该在 1 次接收中显示它们
    • 它以这种方式工作的原因是因为它是设计的工作方式,并且这种设计(在二十多年前首次指定)有充分的理由我不会进入这里。此外,从 API 中可以清楚地看出,仅返回 1 条消息,因为返回对象只是 Message(即不是 Message 对象或类似对象的集合)。
    猜你喜欢
    • 2018-08-22
    • 2017-08-14
    • 1970-01-01
    • 1970-01-01
    • 2018-08-22
    • 2013-08-25
    • 2021-03-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多