如果有人实现事务性文件归档,请帮助我。
在较早的线程(transactional write)中讨论了相关主题。
用例如下:
如果写入日志文件失败,则应回退相应的数据库事务。
因此,应以事务处理方式执行写入文件的操作。
我选择了Apache Commons Transaction lib。
还有问题,因为没有找到合适的文档或示例,所以不能让我走得更远。
我创建了FileResourceManager的实例:
据我从Apache Commons Transaction tutorial理解,我应该执行以下步骤:
frm.start();
transactionId = frm.generatedUniqueTxId();
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");
}
}