[英]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.