您完全可以在 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 中的消息驻留在内存中;如果发件人崩溃,您将丢失这些消息。
希望对你有帮助!