JMS QueueReceiver-需要让接收者等待一段时间,即使队列中有可用的消息
我必须更新我现有的JMS接收器程序,如下所示 现有功能:JMS QueueReceiver-需要让接收者等待一段时间,即使队列中有可用的消息,jms,Jms,我必须更新我现有的JMS接收器程序,如下所示 现有功能: 我的receiver类将读取一条消息,并在消息以xml形式接收后调用web服务来处理其中一个服务器中的作业 新功能: 接收者应该等待一段时间,直到作业服务器可以自由处理作业。我尝试使用MessageSelector,但它仅适用于消息头。我尝试了此选项“message=(JMSTextMessage)mqQueueReceiver.receive(1000000000000);”,但每当我发布消息时,这些消息都会在发布到队列中后被读取。
- 我的receiver类将读取一条消息,并在消息以xml形式接收后调用web服务来处理其中一个服务器中的作业 新功能:
- 接收者应该等待一段时间,直到作业服务器可以自由处理作业。我尝试使用MessageSelector,但它仅适用于消息头。我尝试了此选项“message=(JMSTextMessage)mqQueueReceiver.receive(1000000000000);”,但每当我发布消息时,这些消息都会在发布到队列中后被读取。但我想让接收者等待一段时间,这段时间我是通过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);
while(true){
receive(timeout)
方法将等待消息到达队列的指定超时时间。如果消息在超时之前到达队列,则该方法将立即返回消息,否则该方法将等待到超时时间,然后不返回消息。您将看到2033异常
为receive()
调用指定的timeout
指示receive
方法必须等待消息多长时间才能返回。指定的超时不是为了延迟消息传递。如果有消息,该方法将立即返回
我认为可以修改您的逻辑以改变执行顺序。更改代码以仅在您的web服务准备好处理消息时接收消息。感谢您的回复。我使用不同的逻辑来解决此问题。我使用了rollback()来解决它!!!!
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;
}
}