我正在寻找一种方法来可靠地从 JMS 队列中检索消息并将它们存储到平面文件中。“可靠”是指在任何故障(不包括物理磁盘故障)的情况下,可能在系统和进程重新启动后,我想要:
- 不丢失任何消息和
- 我的文件中没有重复的消息。
实现这一目标的好方法是什么?
上下文:Linux 上的 WebLogic,在几个小时内每秒接收大约 3000 条消息。
谢谢——弗洛里安。
我正在寻找一种方法来可靠地从 JMS 队列中检索消息并将它们存储到平面文件中。“可靠”是指在任何故障(不包括物理磁盘故障)的情况下,可能在系统和进程重新启动后,我想要:
实现这一目标的好方法是什么?
上下文:Linux 上的 WebLogic,在几个小时内每秒接收大约 3000 条消息。
谢谢——弗洛里安。
您将面临的问题是文件系统;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 之间使用分布式事务,从而不会导致消息丢失或重复。
希望能帮助到你