如何延迟JMS消息发送或处理不确定的时间?
我正在使用Weblogic,众所周知,在JMS发送后,接收器将异步处理消息,但是此时或有时外部资源尚未准备好接收器,因此,我希望有一些检查逻辑来延迟发送或处理消息。我猜想例如:将消息放入挂起队列中,然后经常检查资源可用性,一旦准备就发送或处理消息?每个人都知道Weblogic是否支持此功能或如何实现吗?
if( receiverIsAvailable()){
...
}
当接收者可用时,从 tempQueue
出队消息并发送到 remoteQueue
...
Queue tempQueue = (Queue) ctx.lookup("tempQueue");
QueueSession queueLocalSession =
queueConn.createQueueSession(false,
Session.CLIENT_ACKNOWLEDGE);
QueueReceiver queueReceiver = queueLocalSession.createReceiver(tempQueue);
TextMessage localMessage = (TextMessage) queueReceiver.receive();
//send to remote queue
Queue remoteQueue = (Queue) ctx.lookup("remoteQueue");
QueueSender queueSender = queueRemoteSession.createSender(remoteQueue);
Message newMessage = queueRemoteSession.createTextMessage(
localMessage.getText());
queueSender.send( newMessage);
//now acknowledge the message since we safely sent to remoteQueue
localMessage.acknowledge();
ArrayBlockingQueue queue = new ArrayBlockingQueue<String>();
queue.add(messageContents1);
queue.add(messageContents2);
...
if( receiverIsAvailable()){
while(!queue.isEmpty()){
Message message = session.createTextMessage();
message.setText(queue.take());
queueSender.send(message);
}
}
queue
中的消息驻留在内存中; 如果发送者崩溃,您将丢失这些消息。通常为了延迟接收消息直到资源准备好,不会调用connection.start()方法。以下是逻辑:
您甚至可以使用此方法暂停由消息监听器接收的消息。这种技术在使用JMS的GUI工具中非常常见。
假设您正在使用Websphere MQ,我认为它不受支持。
JMS 2.0确实支持消息的延迟传递[1],但如果没有更多信息,很难回答。
[1]https://java.net/projects/jms-spec/pages/JMS20FinalRelease#What_s_new_in_JMS_2.0?
如果外部资源没有准备好,您可以让接收器进入阻塞状态。由于接收器处于“忙碌”状态,因此在其被阻塞期间不会从队列中拉取更多的消息。