綜合事務系統:XADisk
XADisk 是一個開源的綜合事務系統,支持從 Java 和 JavaEE 應用程序對文件系統進行事務性訪問。使用一些簡單的 API,您可以將 XADisk 部署在任何 JVM 上,無需在操作系統上執行任何安裝。部署之后,應用程序就會調用 XADisk API 在事務內執行各種各樣的文件 IO 操作。
XADisk 還提供了其他許多功能,比如 XA 事務、完全的 JCA 合規性、入站消息等。這些功能不屬于這篇簡介文章的介紹范圍。
可將 XADisk 視為應用程序與文件系統之間的一個層。XADisk 本身不是一種文件系統實現;它可用于各種各樣的文件系統(比如 NTFS、FAT、ext3),并且支持應用程序對這些文件系統執行事務性訪問。應用程序可調用 XADisk API 來執行各種 I/O 操作,以單個事務的形式提交或回滾所有這些操作。
XADisk 是使用 Java 編寫的,在 Java 5 或其更高版本上運行。它可供所有類型的 Java 應用程序、在 Java 服務器中運行的 Web 應用程序(比如 Apache Tomcat)和在 JavaEE 服務器中運行 JavaEE 應用程序等使用。
作為 XADisk 用途的一個簡單示例,可以考慮一個 Java 應用程序。這個應用程序希望創建一個名為 F1 的新文件,從另一個名為 F2 的文件向它寫入一些數據,然后刪除 F2。這 3 個操作可使用 XADisk 在單個事務內執行,并具有前面提及的 ACID 屬性的典型跡象。即使應用程序在中途崩潰,XADisk 也會維護這些跡象。
XADisk 支持對文件/目錄執行多種不同的操作:
-
文件 — 創建、刪除、移動、復制、截斷、讀取、寫入、存在、getLength
-
目錄 — 創建、刪除、移動、列出子目錄、存在
當使用 XADisk 時,應用程序和目標文件系統需要在同一個機器上。應用程序可采用與部署在相同 JVM 上的 XADisk 相同的方式遠程調用 XADisk API。
詳細介紹文章:http://www.ibm.com/developerworks/cn/opensource/os-xadisk/index.html
簡單示例:
import java.io.File; import java.io.IOException; import org.xadisk.bridge.proxies.interfaces.Session; import org.xadisk.bridge.proxies.interfaces.XAFileSystem; import org.xadisk.bridge.proxies.interfaces.XAFileSystemProxy; import org.xadisk.filesystem.exceptions.XAApplicationException; import org.xadisk.filesystem.standalone.StandaloneFileSystemConfiguration; public class XADiskHelloWorld { public static void main(String args[]) { String xadiskSystemDirectory = "C:\\xadisk"; File sampleDataDir1 = new File("C:\\data1"); XAFileSystem xafs = null; try { StandaloneFileSystemConfiguration configuration = new StandaloneFileSystemConfiguration(xadiskSystemDirectory, "id-1"); xafs = XAFileSystemProxy.bootNativeXAFileSystem(configuration); System.out.println("\nBooting XADisk...\n"); xafs.waitForBootup(-1); System.out.println("\nXADisk is now available for use.\n"); Session session = xafs.createSessionForLocalTransaction(); try { session.createFile(sampleDataDir1, true); session.createFile(new File(sampleDataDir1, "a.txt"), false); session.commit(); System.out.println("\nCongratulations! You have successfully run the XADisk-Hello-World.\n"); } catch (XAApplicationException xaae) { session.rollback(); throw xaae; } } catch (Throwable t) { t.printStackTrace(); } finally { if (xafs != null) { try { xafs.shutdown(); } catch (IOException ioe) { ioe.printStackTrace(); } } } } }