1

我正在寻找一种方法来可靠地从 JMS 队列中检索消息并将它们存储到平面文件中。“可靠”是指在任何故障(不包括物理磁盘故障)的情况下,可能在系统和进程重新启动后,我想要:

  1. 不丢失任何消息和
  2. 我的文件中没有重复的消息。

实现这一目标的好方法是什么?

上下文:Linux 上的 WebLogic,在几个小时内每秒接收大约 3000 条消息。

谢谢——弗洛里安。

4

1 回答 1

0

您将面临的问题是文件系统;JMS 支持 JTA,但文件系统不支持。考虑以下:

public void onMessage(Message message){
  try{
    TextMessage msg = (TextMessage)message;
    fileOutput.write( msg.getText());
    fileOutput.flush();

  }catch(Exception e){
    e.printStackTrace();
    throw e;
  }
}

假设 AUTO_ACKNOWLEDGE,每条收到并序列化到文件的消息将在onMessage()成功返回后自动确认。但是JMS服务器可能在收到确认之前崩溃,但是在消息被写入文件之后;所以你会得到一个副本。

您是否考虑过保存到数据库,而不是写入文件,最好是具有 XA 驱动程序的数据库?如果是这样,您可以在 JMS 和 RDBMS 之间使用分布式事务,从而不会导致消息丢失或重复。

希望能帮助到你

于 2013-10-24T20:54:16.227 回答