Потребитель получает одно сообщение от метода приема в Apache ActiveMQ Artemis - PullRequest
0 голосов
/ 10 июня 2019

Я внедряю 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 или какая-то проблема с кодом?

1 Ответ

0 голосов
/ 10 июня 2019

Вы видите ожидаемое поведение. Звонок 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());

Для получения дополнительной информации см. JavaDoc для javax.jms.MessageConsumer.receive(long)

...