Apache Transaction:以事务方式写入文件 - 如何使用resourceId

ser*_*nni 7 java file transactional apache-commons

如果有人实施了交易写入文件,请帮助我.
在早期的线程(事务性写入)中讨论了相关主题.

用例如下:
如果写入日志文件失败,则应回滚适当的数据库事务.

因此,文件的写入应该以事务方式执行.

我选择了Apache Commons Transaction lib.
并且有问题,这不会让我走得更远,因为没有找到适当的文档或示例.

我创建了FileResourceManager的实例:

FileResourceManager frm = new FileResourceManager("c:\ cur","c:\ cur",true,logger);

据我从这个Apache Commons Transaction教程中了解,我应该实现以下步骤:

  1. 开始交易:
    frm.start();

  2. 获取它的事务ID:
    transactionId = frm.generatedUniqueTxId();

  3. call方法,这是必需的,例如带有transactionId和resourceId的writeResource:
    frm.writeResource(transactionId, resourceId);

这里有歧义:
a)我如何连接resourceId真实资源,我应该交易写作?
b)我的文件如何以交易方式编写,现在将如何resourceId

谢谢你的建议.

ser*_*nni 5

到目前为止没有人回答,我尝试根据我的最新经验来做到这一点。

有用的文档:
example2(.ppt)

简化算法看起来像(实际上,在示例2中描述):
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");
    }
}
Run Code Online (Sandbox Code Playgroud)