运行jms队列生成器发送消息和消费者获取消息但不显示消息

时间:2013-03-06 09:41:14

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

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

producer.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();
    }
}

2 个答案:

答案 0 :(得分:0)

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

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

排队计数 - 显示队列中发布的消息数量 - > 确认您的制作人是否正在发布
出队计数 - 显示已消费但未被确认的消息数#> 确认您的消费者是否已消费
发货计数 - 显示消费和购买消息的数量 - > 确认您的消费者已经确认,即消费者在消费时没有抛出一些异常导致消费者无法收到消息。

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

答案 1 :(得分:-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方法中添加此块,这将起作用。 希望这会有所帮助。