如果有人实施了交易写入文件,请帮助我 在早期的线程(transactional write)中讨论了相关主题。
用例如下:
如果写入日志文件失败,则应回滚适当的数据库事务。
因此,文件的写入应该以事务方式执行。
我选择了Apache Commons Transaction lib 并且有问题,这不会让我更进一步,因为没有找到适当的文档或示例。
我创建了FileResourceManager的实例:
FileResourceManager frm = new 为FileResourceManager( “C:\ CUR”, “c:\ cur”,true,logger);
据我所知Apache Commons Transaction tutorial,我应该实施以下步骤:
开始交易:
frm.start();
获取交易ID:
transactionId = frm.generatedUniqueTxId();
调用方法,这是必需的,例如writeResource with transactionId和resourceId:
frm.writeResource(transactionId, resourceId);
这里含糊不清:
a)我如何将resourceId
与真实资源联系起来,我应该交易写作?
b)我的文件,我将以交易方式编写的文件现在将如何约为resourceId
?
感谢您的建议。
答案 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");
}
}