ScalaとApache Commons Daemonで常駐プログラムを作る

More than 1 year has passed since last update.

なにかと常駐プログラムを書くときがありますよね!

この記事では、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とやってやると常駐プログラムが走ります。