Scala Actor + Commons Transaction
Scala Actor + Apache Commons Transaction の実験コードです。ファイルトランザクションを行います。様々な実験コードが入っています。何かの参考にどうぞ。動かすには、Java Transaction API の class files が必要です。Commons Transaction は現行の1.2と2.0でAPIが全然違うので注意が必要です。
import scala.actors._ import scala.actors.Actor._ import java.io._ import org.apache.commons.transaction.file._ import org.apache.commons.transaction.util._ trait ShutdownUtils { def onShutdown(fn: => Unit) = { Runtime.getRuntime.addShutdownHook(new Thread { override def run() = fn }) } } object TxUtils { // FileResourceManager作成 val log = new PrintWriterLogger(new PrintWriter(System.out, true), "tx", true) val frm = new FileResourceManager(".", "tmp", false, log) frm.start } trait TxUtils { // トランザクション def tx(fileName: String)(fn: PrintWriter => Unit) = { val frm = TxUtils.frm // トランザクション開始 val txID = frm.generatedUniqueTxId frm.startTransaction(txID) frm.createResource(txID, fileName) val out = new PrintWriter(frm.writeResource(txID, fileName, true)) fn(out) // トランザクション終了 out.close frm.commitTransaction(txID) } } object TxTest extends Application with TxUtils with ShutdownUtils { // 受信側 val receiver = actor { // アプリケーションの終了時に0を書き込む onShutdown { tx("test.txt") { out => out println 0 } } // 受け取った数字を追記する loop { react { case i:int => tx("test.txt") { out => out println i } Thread sleep 1000 } } } // 送信側 actor { try { for(i <- 1 to 5) { receiver ! i } Thread sleep 2000 println("commander done") throw new NullPointerException } finally { System exit 0 } } }