gpt4 book ai didi

java - 如何延迟 JMS 消息发送?

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:26:00 25 4
gpt4 key购买 nike

如何延迟 JMS 消息发送或进行不确定时间?

我用的是Weblogic,大家知道,JMS发送后,接收者会异步处理消息,但是,这个时候或者有时候外部资源还没有为接收者准备好,所以,我想有一些检查逻辑延迟发送或处理消息。我猜例如:我将消息放入待定队列,然后经常检查资源可用性,一旦它发送或继续消息?

大家都知道Weblogic是否支持这个或者如何实现它?

最佳答案

您完全可以在 JMS 中执行此操作,只需使用本地队列来存储消息;当接收者可用时发送到远程队列。

选项 1(理想、安全)

1) 首先,在WebLogic中创建一个JMS Server,LocalJMSServer

2) 确保仅将此资源定位到本地 WebLogic 实例。

3) 为 LocalJMSServer 创建一个队列 tempQueue

4) 您的应用程序始终将消息发送到 tempQueue。由于该队列是本地的,因此消息只是位于队列中,并且它们也被持久化,这在服务器崩溃的情况下很好。

5) 您需要在 WebLogic 中使用单独的 JMSServer 配置来托管 remoteQueue,因为该队列将以远程 WebLogic 实例为目标。

6) 您的应用程序定期检查远程接收器的可用性:

   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();

我喜欢这种方法,因为它是完全事务性的;如果出现任何问题,只要您使用 PERSISTENT 模式,您就不会丢失消息。此外,当从 tempQueue 中拉取消息时,您必须使用同步接收器(如上所述),您不能使用 onMessage() 因为它会立即处理来自本地队列的消息.

选项 2(更简单,不太安全)

您还可以使用内存队列(不是 JMS)在本地存储消息内容:

ArrayBlockingQueue queue = new ArrayBlockingQueue<String>();
queue.add(messageContents1);
queue.add(messageContents2);
...

您的应用程序检查接收方的资源可用性,如果可用,则立即出列并发送真正的 JMS 消息:

if( receiverIsAvailable()){
while(!queue.isEmpty()){
Message message = session.createTextMessage();
message.setText(queue.take());
queueSender.send(message);
}
}

这种方法的问题是存储在 queue 中的消息驻留在内存中;如果发件人崩溃,您将丢失这些消息。

希望对您有所帮助!

关于java - 如何延迟 JMS 消息发送?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21337564/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com