【问题标题】:while runnning jms queue producer sends message and consumer gets message but message is not displayed运行 jms 队列时,生产者发送消息,消费者获取消息但不显示消息
【发布时间】:2013-02-21 00:43:05
【问题描述】:

您好,我有一个包含生产者和消费者的 java 代码。生产者将消息发送到队列,消费者也收到消息,但我不知道为什么不显示消息。我正在使用activeMQ,因为我没有收到消息,所以我在http:/localhost:8161/admin/queues.jsp 中签入,它显示队列同时具有生产者和消费者但是消息没有打印在命令提示符。请告诉我

生产者.java

import javax.jms.*;
import org.apache.activemq.ActiveMQConnection;
import org.apache.activemq.ActiveMQConnectionFactory;

public class Producer {

    private static String url = ActiveMQConnection.DEFAULT_BROKER_URL;
    private static String subject = "test";

    public static void main(String[] args) throws JMSException {

        ConnectionFactory connectionFactory =
            new ActiveMQConnectionFactory(url);
        Connection connection = connectionFactory.createConnection();
        connection.start();

        Session session = connection.createSession(false,
            Session.AUTO_ACKNOWLEDGE);
        Destination destination = session.createQueue(subject);
        MessageProducer producer = session.createProducer(destination);

        TextMessage message = session.createTextMessage("this is a g message");
        producer.send(message);

        System.out.println("Sent message '" + message.getText() + "'");
System.out.println( ActiveMQConnection.DEFAULT_BROKER_URL);
        connection.close();
    }
}

consumer.java

import javax.jms.*;

import org.apache.activemq.ActiveMQConnection;
import org.apache.activemq.ActiveMQConnectionFactory;

public class Consumer {

    private static String url = ActiveMQConnection.DEFAULT_BROKER_URL;
    private static String subject = "test";

    public static void main(String[] args) throws JMSException {

        ConnectionFactory connectionFactory
            = new ActiveMQConnectionFactory(url);
        Connection connection = connectionFactory.createConnection();
        connection.start();

        Session session = connection.createSession(false,
            Session.AUTO_ACKNOWLEDGE);

        Destination destination = session.createQueue(subject);
        MessageConsumer consumer = session.createConsumer(destination);
        Message message = consumer.receive();

        if (message instanceof TextMessage) {
            TextMessage textMessage = (TextMessage) message;
            System.out.println("Received message '"
                + textMessage.getText() + "'");
        }
        connection.close();
    }
}

【问题讨论】:

  • a) 请尝试格式化代码:减少空行,删除不必要的 cmets 等; b)您是否尝试过在消费者处调试代码?我一眼看不出有什么完全错误的,但你能确定这条消息是TextMessage吗?只是为了确定......
  • @DaDaDom 感谢您的回复,是的,它是一个文本消息,我尝试在不使用诸如 system.out.println(message) 之类的 if 条件的情况下进行打印;但它没有给任何
  • 我在本地运行了您的代码,消息发送和接收并输出到控制台没有任何问题。
  • @TimBish 感谢您的回复,是的,这是有效的,但有时它会在我的系统中产生问题。当它不起作用时,我必须重新启动 activeMQ 服务器,然后它才能工作。我不知道为什么会这样。
  • 您是否在消费者处收到消息,您能否在 If 块 if (message instanceof TextMessage) 上方打印“消息”对象并告诉我们?

标签: java jms activemq producer-consumer jms-topic


【解决方案1】:

你必须implementMessageListener

public class Consumer implements MessageListener 

你需要像这样覆盖onMessage

@Override
    public void onMessage(Message message) {

        if(message instanceof TextMessage){
                  //DO something
   }
}

在设置此消费者时,您需要执行以下操作:-

ActiveMQConnectionFactory connectionFactory= new ActiveMQConnectionFactory(ActiveMQConnection.DEFAULT_BROKER_URL);
Connection jmsConnection = connectionFactory.createConnection(userName,passWord);

            jmsConnection.start();
            Session jmsSession =  jmsConnection.createSession(false, Session.AUTO_ACKNOWLEDGE);


            Destination destination = jmsSession.createQueue(queuname);

            //Subscribing to a Topic
            MessageConsumer msgConsumer = jmsSession.createConsumer(destination);
            msgConsumer.setMessageListener(this);


编辑
一旦消息到达队列,此代码将继续侦听消息。 您可以在 main 方法中添加此块,这将起作用。 希望这会有所帮助。

【讨论】:

  • 本示例中不需要使用异步消息侦听器样式。发布的代码使用阻塞同步接收,这意味着它将永远等待接收消息。
  • @Anubhab 感谢您的回复,正如您所见,我在里面做所有事情,所以我不能用“这个”告诉我任何其他方式
  • “里面的一切”是什么意思?
  • @Anubhab 我在 main 里面做所有事情
  • 这不是问题。使用'this'。即使在那之后它也没有连接吗?将代码粘贴到 main 中并覆盖 onMessage。它应该按原样工作。
【解决方案2】:

在我看来代码应该可以工作。不是说显而易见的,但是您确定您在同一系统上运行生产者和消费者吗?您要连接的默认代理 URL 依赖于 localhost - 因此显然生产者和消费者必须在同一个系统上。您确定您的独立 java 应用程序正在连接到 activeMQ 服务器并成功创建连接吗?

如果是,那么您能否connect via jmx 并检查队列中的以下指标:

Enqueue count - 显示在队列中发布的消息数量 -> 确认您的生产者是否正在发布
出队计数 - 显示已消费但未确认的消息数 -> 确认您的消费者是否已消费
Dispatch count - 显示已消费和确认的消息数 -> 确认您的消费者已确认,即消费者在消费时未抛出导致其无法确认消息的异常。

如果一切正常,这些计数应该都相等。

【讨论】:

    猜你喜欢
    • 2016-12-10
    • 1970-01-01
    • 1970-01-01
    • 2013-08-01
    • 2013-08-08
    • 1970-01-01
    • 2019-05-20
    • 1970-01-01
    • 2020-12-09
    相关资源
    最近更新 更多