如果有人实现事务性文件归档,请帮助我。
在较早的线程(transactional write)中讨论了相关主题。

用例如下:
如果写入日志文件失败,则应回退相应的数据库事务。

因此,应以事务处理方式执行写入文件的操作。

我选择了Apache Commons Transaction lib。
还有问题,因为没有找到合适的文档或示例,所以不能让我走得更远。

我创建了FileResourceManager的实例:



据我从Apache Commons Transaction tutorial理解,我应该执行以下步骤:

  • 开始交易:frm.start();
  • 为其获取交易ID:transactionId = frm.generatedUniqueTxId();
  • 调用方法,例如具有transactionId和resourceId的writeResource:frm.writeResource(transactionId, resourceId);

  • 这是模棱两可的:
    a)我该如何将resourceId与实际资源联系起来,以便我应该进行跨语言编写?
    b)我现在将如何处理有关resourceId的文件,该如何处理?

    谢谢你的指教。

    最佳答案

    到目前为止,没有人回答,我尝试从最新经验中做到这一点。

    有用的文献资料:
    example2(.ppt)

    简化的算法看起来像(实际上在example2中描述):
    1. 初始化FileResourceManager
    2. 启动FileResourceManager
    3. 从FileResourceManager实例获取事务ID
    4. 使用第3步中的交易ID开始交易
    5.所需的编写资源-这里提到了通过事务处理编写,因此看起来这是主要步骤!
    6. 提交或回滚事务

    注意:关于我的问题,我的问题是 resourceId ,它只是事务文件名称
    此命名不能很好地描述此属性。

    代码,我用过:

    private static final org.apache.log4j.Logger logger = org.apache.log4j.Logger.getLogger(FileAppender.class);
    private static LoggerFacade loggerFacade = new Log4jLogger(logger);
    
    private static String tempDir = (String) System.getProperties().get("java.io.tmpdir");
    
    private FileResourceManager frm = new FileResourceManager(tempDir, tempDir, false, loggerFacade);
    private static OutputStream outputStream;
    
    public void writeOut(E event) throws IOException {
        Object txId = null;
        try {
            frm.start();
            txId = frm.generatedUniqueTxId();
            frm.startTransaction(txId);
            outputStream = frm.writeResource(txId, fileName, true);
            frm.commitTransaction(txId);
    
        }
    
        catch (Exception e) {
            throw new IOException("DB rollback");
        }
    }
    

    09-29 21:32