Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JMS消息以可靠的方式归档_Java_Transactions_Jms - Fatal编程技术网

Java JMS消息以可靠的方式归档

Java JMS消息以可靠的方式归档,java,transactions,jms,Java,Transactions,Jms,我正在寻找一种可靠地从JMS队列检索消息并将其存储到平面文件中的方法。所谓“可靠”,是指在发生任何故障(不包括物理磁盘故障)的情况下,可能在系统和进程重新启动后,我希望: 不丢失任何信息和 我的文件中没有重复的邮件 实现这一目标的好方法是什么 上下文:Linux上的WebLogic,在几个小时内每秒接收大约3000条消息 谢谢——Florian。您将面临的问题是文件系统;JMS支持JTA,但文件系统不支持。考虑以下事项: public void onMessage(Message message

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

  • 不丢失任何信息和
  • 我的文件中没有重复的邮件
  • 实现这一目标的好方法是什么

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


    谢谢——Florian。

    您将面临的问题是文件系统;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;
      }
    }
    
    假设自动确认,在
    onMessage()
    成功返回后,接收并序列化到文件的每条消息都将自动确认。但是JMS服务器可能在收到确认之前崩溃,但在消息写入文件之后崩溃;所以你会得到一个副本

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


    希望它有帮助

    是的,当然问题是文件系统没有事务功能。我需要写入文件,而不是数据库。因此,我需要以某种方式在文件系统上实现一个事务方案——这正是我所需要的。是否有任何方式(要实现的API?)来参与分布式事务?是的,您可以实现自己的XA驱动程序,但这并不是小事。另一种选择是使用轻量级的本地数据库,如支持XA的HSQLDB。您可以从存储按需消息的表生成一个文件。啊。。。另一个想法稍有不同:将数据写入平面文件,然后在“提交”时执行以下操作:1)将文件刷新到磁盘,并进行事务处理:2)将文件指针写入XA数据库,3)在JMS队列中进行通信更改。回滚可以通过将文件截断回XA数据库所说的指针所在的位置来完成。你认为这样行吗?哦,我明白了,所以你只把最后一条消息写入文件的位置保存到数据库中?是的,可以,我喜欢!谢谢是的,我想我会选择这个。未来的美好时光:)