繁体   English   中英

异步连接到 IBM MQ 时无法使用消息或仅检索到一条消息?

[英]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);
        }
    }

}

   

我可以在您的代码中看到两个问题。

  1. 设置消息监听后没有connection.Start()方法调用。 如果不调用 connection.Start 方法,消息传递将不会开始。 我想知道应用程序如何在没有 Start() 的情况下接收消息。

  2. 您的应用程序在之后立即退出

"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 日进一步更新:您的应用程序中有两个线程:

  1. 创建连接、消费者和消息侦听器的主线程。 将消息侦听器附加到消费者。
  2. 消息侦听器线程 - 由 MQ 库调用以将消息传递到您的应用程序。

主线程控制应用程序的生命周期。 如果结束,您的应用程序中的所有其他线程也将结束。 不要期望消息侦听器线程即使在主线程结束后也会运行。 这是基本的线程概念,与消息侦听器无关。 消息侦听器在这里没有问题,它按设计工作。

JMS 只是一个 API 规范,而不是一个实现。 像 MQ JMS 这样的许多供应商都实施了这些规范。

您可能希望在主线程本身上使用同步 consumer.recieve() 或 consumer.receiveNoWait() 方法,而不是使用异步使用者。 如果可用,这些 API 会检索消息,如果没有消息,则返回 null。 您可以检查 null 并退出。

希望这可以帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM