Scala 将akka作为系统作业运行

Scala 将akka作为系统作业运行,scala,akka,daemon,systemd,jsvc,Scala,Akka,Daemon,Systemd,Jsvc,我想运行一个Akka应用程序,当机器启动时,该应用程序在带有systemd的系统上自动运行并重新启动。我一直在尝试使用apachedaemon/jscv实现这一点,但遇到了一些问题。现在我只是试着运行第一步,但已经失败了。我输入以下代码 object Launcher extends Daemon { val system = ActorSystem("testsystem") var schedule: Cancellable = new Cancellable{ def c

我想运行一个Akka应用程序,当机器启动时,该应用程序在带有systemd的系统上自动运行并重新启动。我一直在尝试使用apachedaemon/jscv实现这一点,但遇到了一些问题。现在我只是试着运行第一步,但已经失败了。我输入以下代码

object Launcher extends Daemon {

  val system = ActorSystem("testsystem")
  var schedule: Cancellable = new Cancellable{
    def cancel(): Unit = ()
    def isCancelled: Boolean = true
  }

  def roll(rand: Random) = () => {
    rand.nextInt(6)
  }

  val selection = system.actorSelection("mytestactor")


  def init(context: DaemonContext) = {
    val ref = system.actorOf(Props[TestActor], "mytestactor")
  }

  def start = {
    import scala.concurrent.ExecutionContext.Implicits.global
    val jrand = new Random()
    val roller = roll(jrand)
    schedule = system.scheduler.schedule(Duration(0, SECONDS), Duration(2, SECONDS))( () => selection ! roller() )
  }



  def stop = {
    if (!schedule.isCancelled) {
      schedule.cancel()
    }
  }

  def destroy = {
    system.shutdown()
  }

}

class TestActor extends Actor {

  def receive = {
    case 0 => println("rolled zero")
    case n: Int if n < 6 => println("rolling")
  }
}

我应该怎么做才能使这种方法起作用?这是否至少是一个可行的方向,当我想在systemd脚本开始工作后编写它时,还是我认为它完全错了?

要使用jsvc,请使用完全限定的类名,并使用普通类,而不是对象。启动程序调用将看起来更像

sudo jsvc -outfile ~/out.txt -errfile ~/err.txt -cp commons-daemon.jar:akkadaemon.jar Fully.Qualified.Name.Of.Launcher

你能试试sudo jsvc-outfile~/out.txt-errfile~/err.txt-cp commons daemon.jar:akkadaemon.jar Launcher$吗?这给了我ClassNotFoundException:Launcher$。手动检查生成的jar并查看它包含什么是一个好主意,还是我正在走向疯狂?啊哈!但是使用完全限定的类名使我无法使用私有修饰符访问类ns.Launcher$的成员。
sudo jsvc -outfile ~/out.txt -errfile ~/err.txt -cp commons-daemon.jar:akkadaemon.jar Fully.Qualified.Name.Of.Launcher