Как отладить демон Jsvc в IntelliJ? - PullRequest
0 голосов
/ 05 ноября 2018

Я только что написал небольшого простого демона с Apache Commons Daemon, который работает с jsvc. Вот как я сейчас запускаю демон:

CLASS_PATH="/usr/share/java/commons-daemon.jar":"/home/myuser/myproject/build/libs/JsvcHelloWorld-1.0-SNAPSHOT.jar"
PID=/tmp/myjsvcdaemon.pid
LOG_OUT=/tmp/myjsvcdaemon.out
LOG_ERR=/tmp/myjsvcdaemon.err
CLASS=JsvcHelloWorld
jsvc -home "$JAVA_HOME" -cp $CLASS_PATH -user $USER -outfile $LOG_OUT -errfile $LOG_ERR -pidfile $PID $1 $CLASS    

А вот как выглядит мой Java-файл Daemon:

import org.apache.commons.daemon.Daemon;
import org.apache.commons.daemon.DaemonContext;
import org.apache.commons.daemon.DaemonInitException;

public class JsvcHelloWorld2 implements Daemon {

    private Thread myThread;
    private boolean stopped = false;
    private boolean lastOneWasATick = false;

    @Override
    public void init(DaemonContext daemonContext) throws DaemonInitException, Exception {
        /*
         * Construct objects and initialize variables here.
         * You can access the command line arguments that would normally be passed to your main()
         * method as follows:
         */
        String[] args = daemonContext.getArguments();

        myThread = new Thread() {
            private long lastTick = 0;

            @Override
            public synchronized void start() {
                JsvcHelloWorld2.this.stopped = false;
                super.start();
            }

            @Override
            public void run() {
                while (!stopped) {
                    long now = System.currentTimeMillis();
                    if (now - lastTick >= 1000) {
                        System.out.println(!lastOneWasATick ? "tick" : "tock");
                        lastOneWasATick = !lastOneWasATick;
                        lastTick = now;
                    }
                }
            }
        };
    }

    @Override
    public void start() throws Exception {
        myThread.start();
    }

    @Override
    public void stop() throws Exception {
        stopped = true;
        try {
            myThread.join(1000);
        } catch (InterruptedException e) {
            System.err.println(e.getMessage());
            throw e;
        }
    }

    @Override
    public void destroy() {
        myThread = null;
    }
}

Как видите, в демоне нет метода main, кто-нибудь знает, как отлаживать демоны jsvc в IntelliJ? Пожалуйста, помогите всем! :)

...