не удалось заставить потребителя activemq деактивироваться

Я создаю приложение чата JMS, используя activemq и весеннюю загрузку. Я пытаюсь отправить сообщение от производителя нескольким подписчикам. Я могу отправить сообщение, т.е. сообщение поставлено в очередь. но в моей части получателя сообщение не может быть исключено из очереди. Я использую приведенный ниже код для передачи сообщения от производителя нескольким подписчикам.

public class WelcomeController implements MessageListener {

    public static Boolean TRANSACTIONAL = false;
    public static String TOPIC_NAME = "firstTopic";

    public static String BROKER_URL = "tcp://localhost:61616";
    public static String BROKER_USERNAME = "admin";
    public static String BROKER_PASSWORD = "admin";


    public void createProducer() throws JMSException {
       Connection connection = null;
        Session session = null;
        try {
            ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory();
            connectionFactory.setBrokerURL(BROKER_URL);
            connectionFactory.setPassword(BROKER_USERNAME);
            connectionFactory.setUserName(BROKER_PASSWORD);

            connection = connectionFactory.createConnection();
            connection.setClientID("CircliTopic");
            connection.start();
             session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);


            for (int i = 1; i <= 3; i++) {
               session = connection.createSession(TRANSACTIONAL,
                  Session.AUTO_ACKNOWLEDGE);
              Topic destination = session.createTopic(TOPIC_NAME);
              MessageProducer producer = session.createProducer(destination);
              TextMessage message = session.createTextMessage();
              message.setText( "My text message was send and received");//
                System.out.println("Sending text '" + message + "'");
                producer.send(message);
              MessageConsumer consumer = session
                  .createDurableSubscriber(destination, "Listener" + i);

              consumer.setMessageListener(new WelcomeController());

            }



        } finally {
            connection.close();
        }`
}

@Override
public void onMessage(Message message) {

     try {

          if (message instanceof TextMessage) {
            TextMessage text = (TextMessage) message;
            System.out.println(" - Consuming text msg: " + text.getText());
          } else if (message instanceof ObjectMessage) {
            ObjectMessage objmsg = (ObjectMessage) message;
            Object obj = objmsg.getObject();
            System.out.println(" - Consuming object msg: " + obj);
          } else {
            System.out.println(
                " - Unrecognized Message type " + message.getClass());
          }
        } catch (JMSException e) {
          e.printStackTrace();
        }

}

Я могу получать текстовые сообщения в своей консоли, но мое сообщение не удаляется из очереди для подписчиков, а также сообщение на моем сервере activemq не удаляется из очереди.


person Lipsa Patra    schedule 16.10.2018    source источник
comment
Вы создаете подписку до того, как сообщения будут поставлены в очередь? В противном случае сообщения не смогут попасть в подписку.   -  person Justin Bertram    schedule 16.10.2018


Ответы (1)


Вы создаете подписку на тему только после того, как сообщение было отправлено, и это не сработает, потому что это темы, а тема без подписки просто отбрасывает все сообщения, отправленные в нее. Вам необходимо установить постоянную подписку на тему до отправки каких-либо сообщений или переключиться на очереди, если ваш дизайн позволяет, поскольку очередь будет хранить отправленное сообщение до тех пор, пока оно не будет использовано.

Трудно сказать больше, не зная ваших требований, но, похоже, вам нужно потратить немного больше времени на понимание того, как работают темы.

person Tim Bish    schedule 16.10.2018