我必須將現有的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;
}
}
感謝您的回覆。我正在使用不同的邏輯來解決這個問題。我用rollback()來解決它! –