なにかと常駐プログラムを書くときがありますよね!
この記事では、Apache Commons Daemonを使ってデーモンを作り、SBTのAssemblyプラグインを使って実行可能なJarを作ります。
実装
SBTの依存に"commons-daemon" % "commons-daemon" % "1.0.10"
を追加して、reloadとupdateを事前にしておきます。
object Service extends App {
val akuma = new Akuma
akuma.start
}
import org.apache.commons.daemon.Daemon
import org.apache.commons.daemon.DaemonContext
import java.util.concurrent.ExecutorService
import java.util.concurrent.Executors
class Akuma extends Daemon {
val executorService = Executors.newSingleThreadExecutor
override def init(dc: DaemonContext) {
}
override def start {
println("start daemon")
executorService.execute(new Runnable() {
def run() {
try {
// do something.
} catch {
case e: InterruptedException => println(e)
}
}
})
}
override def stop {
println("halt daemon")
executorService.shutdown()
}
override def destroy {
}
}
ExecutorServiceを使ってスレッドを実行します。
build.sbt
build.sbt
import AssemblyKeys._
name := "daemon"
organization := "daemon"
version := "0.1.0-SNAPSHOT"
scalaVersion := "2.10.3"
libraryDependencies ++= {
"commons-daemon" % "commons-daemon" % "1.0.10"
}
seq(Revolver.settings: _*)
assemblySettings
jarName in assembly := "jarname.jar" // 出力されるjarの名前
test in assembly := {} // テストをスキップする時はこれを指定
mainClass in assembly := Some("com.foo.Main") // メインクラスの指定
Assembly
% sbt
> assembly
とやると、target/scala-2.10/jarname.jar にJarファイルができるので、java -jar target/scala-2.10/jarname.jar
とやってやると常駐プログラムが走ります。