【问题标题】:unable to make activemq consumer to deque无法使 activemq 消费者去队列
【发布时间】:2019-03-21 01:17:43
【问题描述】:

我正在使用 activemq 和 spring boot 创建一个 JMS 聊天应用程序。我正在尝试从生产者向多个订阅者发送消息。我能够发送消息,即消息已排队。但在我的接收方部分消息无法出队。`我正在使用下面的代码将消息从生产者传递给多个订阅者。

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 服务器消息也没有出队。

【问题讨论】:

  • 您是否在消息入队之前创建订阅?如果没有,消息就无法进入订阅。

标签: spring-boot activemq jms-topic


【解决方案1】:

您仅在发送消息后才创建主题订阅,这将不起作用,因为这些是主题,而没有订阅的主题只会丢弃发送给它的所有消息。您需要在发送任何消息之前建立持久的主题订阅,或者如果您的设计允许,则切换到队列,因为队列将存储发送给它的消息直到被使用。

在不了解您的要求的情况下很难说更多,但您似乎需要花更多时间了解主题的工作原理。

【讨论】:

    猜你喜欢
    • 2014-06-27
    • 2012-08-11
    • 2019-02-26
    • 1970-01-01
    • 2016-05-16
    • 2018-12-18
    • 1970-01-01
    • 2015-11-25
    • 2016-11-14
    相关资源
    最近更新 更多