小编典典

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

java

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

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

我选择了Apache Commons Transaction库。
还有一个问题,那就是我没有找到更合适的文档或示例,这让我无法走得更远。

我创建了FileResourceManager的实例:

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

从本Apache Commons
Transaction教程
了解到,我应该实现以下步骤:

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

  2. 获取交易ID:
    transactionId = frm.generatedUniqueTxId();

  3. 需要的调用方法,例如带有transactionId和resourceId的writeResource:
    frm.writeResource(transactionId, resourceId);

这是模棱两可的:
a)我该如何resourceId与真实资源联系起来,以便我可以跨事务地写作?
b)我现在将如何处理交易的文件如何处理resourceId

谢谢你的指教。


阅读 211

收藏
2020-11-19

共1个答案

小编典典

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

有用的文档资料:
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");
    }
}
2020-11-19