2012-12-22 71 views
1

我必須將現有的JMS Receiver程序更新爲如下所示。JMS QueueReceiver - 需要等待某個時間,即使消息在隊列上可用

現有功能:

  • 我的接收器類將讀取消息並調用Web服務,一旦消息被接收爲XML處理作業的服務器之一。

    新功能:

  • 接收方應等待一段時間,直到作業服務器可以自由地處理工作。我嘗試使用MessageSelectors,但它只適用於消息headers.I嘗試此選項「message =(JMSTextMessage)mqQueueReceiver.receive(100000000000000);」但每當我發佈消息後,這些消息被髮布到隊列後讀取。但是我想讓接收者等待我從Job服務器通過Web服務調用獲得的一段時間。

我的代碼是下面:

 connectionFactory = new MQQueueConnectionFactory(); 
     connectionFactory.setHostName(config.getValue("host")); 
     connectionFactory.setPort(Integer.parseInt(config.getValue("port"))); 
     connectionFactory.setTransportType(JMSC.MQJMS_TP_CLIENT_MQ_TCPIP); 
     connectionFactory.setQueueManager(config.getValue("manager")); 
     connectionFactory.setChannel(config.getValue("channel")); 
     queueConnection = (MQQueueConnection) connectionFactory.createQueueConnection(); 
        queueSession = (MQQueueSession) queueConnection.createQueueSession(true, Session.CLIENT_ACKNOWLEDGE); 
     queue = (MQQueue) queueSession.createQueue(config.getValue("queue")); 
     mqQueueReceiver = (MQQueueReceiver) queueSession.createReceiver(queue); 

而(真){

 if(this.stopListener) { 
      System.out.println("stopListener variable is changed "); 
      break; 
     } 

     try { 

      message = (JMSTextMessage) mqQueueReceiver.receive(1000); 

      String response = ""; 

      if(this.nullCheckJMSTextObject(message)) { 

       response= soapClient.invokeWebService(message.getText(),message.getJMSCorrelationID()); 

           if(this.nullCheckSoapResponse(response)) { 

        queueSession.commit(); 

       } else { 

        queueSession.rollback(); 
        queueSession.commit(); 
        Thread.sleep(receiverWaitTime); 
       } 
      } 

     } catch (JMSException e) { 
     System.err.println("Linked Exception"); 
     e.getLinkedException(); 
     System.err.println("Error Code"); 
     e.getErrorCode(); 
     System.err.println("Cause "); 
     e.getCause(); 
     System.err.println("fillTrackTrace "); 
     e.fillInStackTrace(); 
      e.printStackTrace(); 
     break; 
     }catch(IllegalStateException e) { 
      e.printStackTrace();  
     break; 
     }catch(InterruptedException e) { 
      e.printStackTrace(); 
     break; 
    }catch(Exception e) { 
     e.printStackTrace(); 
     break; 

     } 
    } 

回答

2

receive(timeout)方法將等待指定的超時時間段消息到達隊列。如果消息在超時之前到達隊列中,則該方法將立即返回一條消息,否則該方法將等待超時時間,然後返回而不發送消息。你會看到一個2033例外。

爲調用指定的timeout表示receive方法在返回消息之前必須等待多長時間。指定的超時不會延遲郵件傳遞。如果有消息,該方法將立即返回。

我認爲你的邏輯可以修改以改變執行順序。只有當您的Web服務準備好處理消息時,纔將代碼更改爲接收消息。

+0

感謝您的回覆。我正在使用不同的邏輯來解決這個問題。我用rollback()來解決它! –