1

嗨,我有 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();
    }
}

消费者.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();
    }
}
4

2 回答 2

0

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

如果是,那么您可以通过 jmx 连接 并检查队列中的以下指标:

Enqueue count - 显示在队列上发布的消息数 ->确认您的生产者是否正在发布
Dequeue count - 显示已消费但未确认的消息数 ->确认您的消费者是否已消费
Dispatch count - 显示已消费的消息数和acked ->确认你的消费者已经确认,即消费者在消费时没有抛出一些异常,导致它无法确认消息。

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

于 2013-08-22T22:52:32.793 回答
-1

你必须implement MessageListener

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 方法中添加此块,这将起作用。希望这可以帮助。

于 2013-03-06T14:36:57.210 回答