导航

Java中的事务文件系统

Posted on 2009-06-10 22:49  Kyle Lee  阅读(747)  评论(0)    收藏  举报
Google搜索一把你能找到一些关于事务文件系统的Java实现,而我选择的是Apache的commons-transaction,为什么?因为经验告诉我从 Apache Foundation诞生的软件都是相当优秀的,并且有很完备的文档。但是commons-transaction可能属于例外了,它没有完备的文档,本文就就简单的描述commons-transaction的用法。


1. 下载并安装Jakartu Commons-Transaction

如果使用Maven,在pom.xml文件中添加以下依赖即可

<dependency>
<groupId>commons-transaction</groupId>
<artifactId>commons-transaction</artifactId>
<version>1.2</version>
</dependency>


如果你使用的是Eclipse,或者是用类notepad的工具编写程序,就要从Apache网站上下载库文件。下载的包中包含commons-transaction所依赖的第三方库,添加到classpath中即可


2. 初始化FileResourceManager

FileResourceManager frm = new FileResourceManager(storeDir, workDir, urlEncode, logger);

下面简要的介绍一下构造函数的几个参数(参考JavaDoc)

storeDir String - FileResourceManager只能对这个目录及其子目录中的文件进行操作。
workDir String - 临时目录,事务使用它来存储临时数据。
urlEncode boolean - 表示路径是否需要用URL编码,在例子中我们使用的是false
logger LoggerFacade - 在使用commons-transaction时你必须登记日志,而不能用“System.out”向屏幕上打印。

在构造完FileResourceManager后,就要开启事务了。

frm.start();

当你在启动FileResourceManager后,它会初始化自己的内部状态,现在他会查找还没有完成的事务。事务的状态将会被检查直到状态变为了“STATUS_COMMITTING",FileResourceManager会试图回滚那些失败的事务,如果回滚也失败了,那么事务就会标记为”脏“,并且需要人工干预了。这和数据库事务差不多。


3. 开始一个事务


每个事务都对应一个唯一的ID,在开始事务时必须提供这样一个唯一的ID。如果你不想自己创建一个ID,那么就让FileResourceManager代劳吧。

String txId = frm.generateUniqueTxId();

现在我们有了一个唯一的ID(txId)就可以开始事务了。

frm.startTransaction(txId);


4. 修改资源

事务启动后我们就可以对文件进行操作了,我们可以进行下面的操作:

# copyResource
# createResource
# deleteResource
# moveResource
# writeResource


下面是一个例子,我们首先删除一个文件,然后移动另一个文件

try {
    frm.deleteResource(txId, "deleteMe.txt");
    frm.moveResource(txId, "fromFile.txt", "destinationFile.txt", true);
    frm.prepareTransaction(txId);
    frm.commitTransaction(txId);
} catch (ResourceManagerException e) {
    e.printStackTrace();
    try {
        frm.rollbackTransaction(txId);
    } catch (Exception e1) {
        e1.printStackTrace();
    }
}


注:Resource的标识都是相对于storeDir而言的 阅读全文
类别:Java 查看评论