从jsvc运行带有commons-daemon的Scala

时间:2015-02-14 00:54:40

标签: scala jsvc apache-commons-daemon

我试图编写一个可以使用commons-daemon作为守护进程运行的基本Scala应用程序。以下代码基于java程序in this post

package daemon

import org.apache.commons.daemon._ 
import java.util.{ Timer, TimerTask, Date }

class EchoTask extends TimerTask{
  def run() { println(new Date() + " running ...") }
}

object DaemonApp extends App with Daemon {
  val timer = new Timer();
  timer.schedule(new EchoTask(), 0, 1000); 

  def init(daemonContext: DaemonContext) {} 
  def start(){} 
  def stop(){} 
  def destroy(){}
}

当我从sbt运行或构建jar时,这工作正常。我无法从jsvc获取代码。例如,如果我跑:

$ ./jsvc -cp $DAEMON_HOME/daemon.jar -pidfile $DAEMON_HOME/pidfile -errfile '&2' -outfile '&1' daemon.DaemonApp 

我将在stderr

上获得以下内容
java.lang.NoSuchMethodException: daemon.DaemonApp.init([Ljava.lang.String;)
    at java.lang.Class.getMethod(Class.java:1670)
    at org.apache.commons.daemon.support.DaemonLoader.load(DaemonLoader.java:176)
Cannot load daemon
Service exit with a return value of 3

我不明白它正在寻找的方法,即init(Array [String])。 scalac是否正在编译主类,使代码与守护程序接口不兼容?

谢谢!

2 个答案:

答案 0 :(得分:0)

我遇到了同样的问题。看起来解决方案是在java中实现这个类。之后我就开始工作了。

答案 1 :(得分:0)

应该将守护进程实现为Scala中的类,而不是对象。当我将Scala中的守护进程编码为对象时,我遇到了这个问题,以便在IDE中运行。