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
    }
  }
}