[英]Unable to consume messages or only one message is getting retrieved while connecting to IBM MQ asynchronous?
我编写了一个 java 代码来使用来自 IBM MQ 的消息。但是在执行代码时,有时只有一条消息被使用并且进程正在停止。有时根本没有消息没有被使用。我写了一个使用 setMessageListener() 进行异步连接,但我不确定程序哪里出错了。 下面的代码
public class MQConnectivity implements MessageListener {
MQQueueConnectionFactory factory = new MQQueueConnectionFactory();
QueueConnection con;
Queue queue;
QueueSession session;
QueueReceiver receiver;
public void init() {
try {
factory.setHostName("******");
factory.setPort(123);
factory.setChannel("Channel1");
factory.setQueueManager("queue_manager");
factory.setTransportType(new Integer(WMQConstants.WMQ_CM_CLIENT));
con=factory.createQueueConnection("user1"," password1");
queue= new MQQueue("myQueue");
session=con.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
receiver=session.createReceiver(queue);
receiver.setMessageListener(this);
System.out.println("=======connection happened=========");
con.start();
System.out.println("=======connection started=========");
}catch(Exception ex) {
System.out.println("exception is : "+ex);
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
new MQConnectivity().init();
}
@Override
public void onMessage(Message msg) {
// TODO Auto-generated method stub
try {
System.out.println("Inside onMessage method");
TextMessage txtMsg=(TextMessage)msg;
System.out.println(txtMsg.getText());
}catch(Exception ex) {
System.out.println("error in onMessage"+ex);
}
}
}
我可以在您的代码中看到两个问题。
设置消息监听后没有connection.Start()方法调用。 如果不调用 connection.Start 方法,消息传递将不会开始。 我想知道应用程序如何在没有 Start() 的情况下接收消息。
您的应用程序在之后立即退出
"System.out.println("=======connection happened=========");"
.
由于 onMessage 方法是在单独的线程上调用的,因此您需要让主线程等待消息处理完成。
将您的应用程序调整为:
//... other code
receiver.setMessageListener(this);
con.start();
System.out.println("=======connection happened=========");
// Wait for a key to be hit.
System.in.read();
希望这可以帮助。
7 月 8 日进一步更新:您的应用程序中有两个线程:
主线程控制应用程序的生命周期。 如果结束,您的应用程序中的所有其他线程也将结束。 不要期望消息侦听器线程即使在主线程结束后也会运行。 这是基本的线程概念,与消息侦听器无关。 消息侦听器在这里没有问题,它按设计工作。
JMS 只是一个 API 规范,而不是一个实现。 像 MQ JMS 这样的许多供应商都实施了这些规范。
您可能希望在主线程本身上使用同步 consumer.recieve() 或 consumer.receiveNoWait() 方法,而不是使用异步使用者。 如果可用,这些 API 会检索消息,如果没有消息,则返回 null。 您可以检查 null 并退出。
希望这可以帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.