用例如下: 如果写入日志文件失败,则应回退相应的DB事务。
因此,应以事务处理方式执行写入文件的操作。
我选择了Apache Commons Transaction库。 还有一个问题,那就是我没有找到更合适的文档或示例,这让我无法走得更远。
我创建了FileResourceManager的实例:
FileResourceManager frm = new FileResourceManager(“ c:\ cur”,“ c:\ cur”,true,logger);
从本Apache Commons Transaction教程了解到,我应该实现以下步骤:
开始交易: frm.start();
frm.start();
获取交易ID: transactionId = frm.generatedUniqueTxId();
transactionId = frm.generatedUniqueTxId();
需要的调用方法,例如带有transactionId和resourceId的writeResource: frm.writeResource(transactionId, resourceId);
frm.writeResource(transactionId, resourceId);
这是模棱两可的: a)我该如何resourceId与真实资源联系起来,以便我可以跨事务地写作? b)我现在将如何处理交易的文件如何处理resourceId?
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"); } }