2013-10-24 17 views
1

我正在寻找一种可靠地从JMS队列中检索消息并将它们存储到平面文件中的方法。通过“可靠”我的意思是,在任何故障(不包括物理磁盘的故障)的情况下,在可能的系统和流程重新推出,我想:JMS消息以可靠的方式存入

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

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

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

谢谢 - 弗洛里安。

回答

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之间的分布式事务,从而不会造成消息丢失或重复。

希望它有帮助

+0

是的,当然问题是文件系统没有事务处理能力。我需要写入一个文件,而不是数据库。 所以我需要以某种方式在文件系统上实现一个交易方案 - 正是我需要的目的。有没有什么办法(一个API来实现?)参与分布式事务? –

+0

是的,你可以实现自己的XA驱动程序,但这不是微不足道的。另一种选择是使用轻量级本地数据库,如支持XA的HSQLDB。您可以根据需要从存储消息的表中生成文件。 – raffian

+0

啊......另一个想法,只是略有不同:将数据写入平面文件,并在“提交”时执行:1)将文件刷新到磁盘,并事务性地:2)向XA数据库写入文件指针,3) JMS队列中的更改。通过将文件截断回到XA数据库指针所在的位置来完成回滚。你认为这会起作用吗? –