не в состоянии заставить потребителя activemq отключаться - PullRequest
0 голосов
/ 16 октября 2018

Я создаю чат-приложение 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 не исключается.

1 Ответ

0 голосов
/ 16 октября 2018

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

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

...