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

时间:2011-01-13 16:40:22

标签: java file apache-commons transactional

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

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

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

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

我创建了FileResourceManager的实例:

  

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

据我所知Apache Commons Transaction tutorial,我应该实施以下步骤:

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

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

  3. 调用方法,这是必需的,例如writeResource with transactionId和resourceId:
    frm.writeResource(transactionId, resourceId);

  4. 这里含糊不清:
    a)我如何将resourceId与真实资源联系起来,我应该交易写作? b)我的文件,我将以交易方式编写的文件现在将如何约为resourceId

    感谢您的建议。

1 个答案:

答案 0 :(得分:4)

至于没有人回答,我尝试从我最近的经验中做到这一点。

有用的文件:
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");
    }
}