2014-10-30 64 views
0

您好,我正在尝试为MQ队列设置一个侦听器,该侦听器需要连续侦听队列并通过onMessage函数传递任何新消息。程序不应该退出。 以下是我的程序片段。 在MQQueueConnection.start上,我在onMessage函数中得到了一个命中,但是从MQ中消耗1个消息后,程序停止。我希望程序永远运行,并通过onMessage函数在队列中传递新消息。任何想法我做错了什么? 春天jms类它按要求工作,但我不想在这里使用春天。MQQueueConnection.start不会持续侦听新邮件

public class MyListener implements MessageListener { 

    @Override 
    public void onMessage(Message message) 
    { 
     try 
     { 
      handleMessage(message,session); 
     } 
     catch (Exception exx) 
     { 
      onHandleMessageException(message, exx); 
     } 
    } 
} 

public class TestListener 
{ 
    public static void main(String[] args) { 
     MyListener myListener = new MyListener(); 
     MQQueueConnectionFactory connFactory = new MQQueueConnectionFactory(); 
     //MyApplicationContext - custom class for loading MQ params 
     MyApplicationContext obj=MyApplicationContext.getInstance(); 

     connFactory.setHostName(obj.getHost()); 
     connFactory.setPort(obj.getPort()); 
     connFactory.setQueueManager(obj.getQueueManagerName()); 
     connFactory.setChannel(obj.getChannel()); 
     connFactory.setTransportType(obj.getTransportType()); 

     MQQueueConnection connection=(MQQueueConnection) connFactory.createQueueConnection(obj.getMqUser(), obj.getMqPWD()) ; 
     MQQueueSession session=(MQQueueSession) connection.createQueueSession(false, Session.AUTO_ACKNOWLEDGE); 

     MQQueue queue = (MQQueue) session.createQueue("TEST.QUEUE"); 
     MQQueueReceiver qReceiver = (MQQueueReceiver) session.createReceiver(queue); 
     qReceiver.setMessageListener(myListener); 

     // expect to start a new thread, which will constantly listen for new messages 
     //on the queue and deliver it in onMessage function. 
     //instead after receiving one message in onMessage, program exits 
     connection.start(); 
    } 
} 
+0

缺少那里util.Timer,执行器,....在合理的时期,创建可管理,但无止境的循环,从主的每个代码行应该在构造函数 – mKorbel 2014-10-30 08:15:50

+0

您是说,要执行整个代码在main函数重复使用计时器?有没有更好的方法来达到要求? – N3Xg3N 2014-10-30 08:31:18

+1

如果您的主线程除了启动消息监听器之外没有其他任何操作,那么主线程本身可以调用Queue.Receive()方法来接收消息。 – Shashi 2014-10-30 10:31:34

回答

1

connection.start()开始一个新的线程,但该线程可能是一个daemon线程,因此在程序结束时结束。你很幸运,你甚至收到1条消息。

试试例如一个Thread.sleep(60000)在主要结束时,听众将停留在空中一分钟,并且您将可能收到几条消息。

+0

好的,你说的是,我必须通过睡眠或线程等待来让自己的主线程保持在空中。 connection.start不会将主线程保留在空中 – N3Xg3N 2014-10-30 10:39:38

+0

这是正确的。 – 2014-10-30 10:53:25

+0

谢谢我要阻止主线程,使用'while(true){synchronized(threadWaitObj){threadWaitObj.wait(); }}'并调用synchronized(threadWaitObj){threadWaitObj.notify(); }在onMessage中。 – N3Xg3N 2014-10-30 11:26:25