JMS消息以可靠的方式存档

时间:2013-10-24 19:11:28

标签: java transactions jms

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

  1. 不丢失任何讯息
  2. 我的档案中没有重复的讯息。
  3. 实现这一目标的好方法是什么?

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

    谢谢 - 弗洛里安。

1 个答案:

答案 0 :(得分: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服务器可能会崩溃,但是在将消息写入文件之后;所以你会得到一份副本。

您是否考虑过保存到数据库,而不是写入文件,而不是写入文件?如果是这样,您可以在JMS和RDBMS之间使用分布式事务,从而不会丢失任何消息或重复。

希望有所帮助