簡體   English   中英

在運行JMS隊列生產者時發送消息,而使用者獲取消息,但不顯示消息

[英]while runnning jms queue producer sends message and consumer gets message but message is not displayed

嗨,我有生產者和消費者的Java代碼。 生產者將消息發送到隊列,而消費者也收到消息,但我不知道為什么不顯示消息。 我正在使用activeMQ,因為我沒有收到消息,所以我在http:/ localhost:8161 / admin / queues.jsp中簽入,它顯示隊列同時具有生產者和消費者,但是消息未打印在命令提示。請告訴我

生產者

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

在我看來,該代碼應該可以工作。 不用說明顯的東西,但是您確定要在同一系統上運行生產者和使用者嗎? 您要連接的默認代理URL依賴於localhost-因此,顯然生產者和使用者必須位於同一系統上。 您確定獨立Java應用程序正在連接到activeMQ服務器並成功創建連接嗎?

如果是,那么您可以通過jmx連接並檢查隊列中的以下指標:

入隊計數-顯示隊列中已發布消息的數量-> 確認您的生產者是否正在發布
出隊計數-顯示已使用但未確認的消息數-> 確認您的使用者是否已使用
調度計數-顯示已使用和已確認的消息數-> 確認您的使用者已確認,即,使用者在使用時未引發某些異常,導致其無法確認消息。

如果一切正常,這些計數應該全部相等。

您必須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方法中,這將起作用。 希望這可以幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM