2014-10-30 2 views
0

안녕하세요, 대기열을 계속 수신하고 onMessage 함수를 통해 새 메시지를 전달해야하는 MQ 대기열의 수신기를 설정하려고합니다. 프로그램을 종료해서는 안됩니다. 다음은 내 프로그램 스 니펫입니다. MQQueueConnection.start에서 onMessage 함수에서 히트를 얻지 만 MQ에서 1 개의 메시지를 소비 한 후 프로그램이 중지됩니다. 나는 프로그램이 영원히 계속 실행되도록하고 onMessage 함수를 통해 대기열에 새 메시지를 전달하기를 원합니다. 내가 뭘 잘못하고 있는거야? spring 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, executor, .... 합리적인 기간, 관리 가능하지만 끝없는 루프 생성, main의 모든 코드 행은 생성자에 있어야합니다. – mKorbel

+0

main 함수에서 전체 코드를 반복적으로 실행하려면 시간제 노동자? 필요한 것을 성취 할 수있는 더 좋은 방법이 있습니까? – N3Xg3N

+1

주 스레드가 메시지 수신기를 시작하는 것 외에 다른 작업을 수행하지 않으면 주 스레드는 자체적으로 Queue.Receive() 메서드를 호출하여 메시지를받을 수 있습니다. – Shashi

답변

1

connection.start() 새로운 스레드를 시작하지만 스레드는 아마 daemon 스레드, 그래서 프로그램이 종료 할 때이 종료됩니다. 운이 좋다면 1 개의 메시지를받을 수 있습니다.

예를 들어 주말에 Thread.sleep (60000)을 사용하면 청취자는 1 분 동안 계속 공중에 머물러있게됩니다. 그러면 몇 가지 메시지가 더 많이 나옵니다.

+0

ok, 나는 잠들거나 쓰레드 대기 상태로 내 메인 쓰레드를 공중에 유지해야한다. connection.start는 메인 스레드를 대기 상태로 유지하지 않습니다. – N3Xg3N

+0

맞습니다. –

+0

주 스레드를 차단하려고합니다. while (true) {synchronized (threadWaitObj) {threadWaitObj.wait(); }}'호출하고'synchronized (threadWaitObj) {threadWaitObj.notify();를 호출한다. } onMessage에서. – N3Xg3N

관련 문제