使用Commons Daemon / JSVC启动Java守护程序的多个实例

时间:2014-01-31 08:07:18

标签: java daemon multiple-instances jsvc

我使用Commons Daemon / JSVC库守护了一个Java程序,并且能够成功启动/停止我的一个服务实例。我真正需要做的是能够启动我的服务的多个实例,使用不同的命令参数启动和停止每个实例。

可能与此问题无关,但有一点背景..我的服务包含一个绑定到特定端口的HTTP侦听器。每个实例都将被初始化以侦听不同的端口。

我的问题是我无法使用Commons Daemon提供的内置功能启动多个Java类实例。也许我错过了什么。我是一名长期的Windows / C#开发人员,但对Java / Linux / Shell脚本来说相对较新。

启动JSVC进程并启动/停止我的守护进程的shell脚本如下所示。这是我在另一篇文章中在本网站上发现的内容,只做了一些小修改。它通过我的守护进程需要的一些命令参数,我从单独的启动和停止脚本调用这个sh脚本来指定这些参数。

#!/bin/sh

# Setup variables
EXEC=/usr/bin/jsvc
JAVA_HOME=/usr/lib/jvm/java-7-oracle
CLASS_PATH="/usr/share/java/commons-daemon-z.0.15.jar":"/opt/LuckyElephant/lib/LuckyElephant.jar"
CLASS=co.rightside.luckyelephant.Main
USER=ubuntu
PID=/tmp/luckyelephant.pid
LOG_OUT=/tmp/luckyelephant.out
LOG_ERR=/tmp/luckyelephant.err
ARGS="$*"

do_exec()
{
    $EXEC -home "$JAVA_HOME" -cp $CLASS_PATH -user $USER -outfile $LOG_OUT -errfile $LOG_ERR -pidfile $PID $1 $CLASS $ARGS
}

case "$1" in
    start)
        do_exec
            ;;
    stop)
        do_exec "-stop"
            ;;
    restart)
        if [ -f "$PID" ]; then
            do_exec "-stop"
            do_exec
        else
            echo "service not running, will do nothing"
            exit 1
        fi
            ;;
    *)
            echo "usage: luckyelephant {start|stop|restart}" >&2
            exit 3
            ;;
esac

如果在JSVC中无法启动多个唯一Java类的多个实例,那么还有什么选择呢?我需要一种安全稳定的方法来启动此服务的多个实例(我将使用SSH远程执行并以编程方式执行),并且由于绑定到TCP端口,每个实例都需要在完成时正常关闭。

3 个答案:

答案 0 :(得分:0)

你可以在最后用&运行你的java程序,让它在后台运行。

答案 1 :(得分:0)

假设需要部署此守护进程的n个实例,假设为3(jDaemon_A,jDaemon_B& jDaemon_C)。 我会使用以下3个选项之一来解决问题:

选项A: 使用单独的数据目录将服务部署3次。并使用命名约定来区分每个例如。

jDaemon_A using directory /root/jdA;
jDaemon_B using directory /root/jdB;
jDaemon_C using directory /root/jdC;

这样你就可以开始每个人

service jDaemon_A start
etc…

选项B: 实现上面的,再加上另一个Java类,它将在上面管理尽可能多的实例,以便你可以传递参数:

service jDaemon_Manager start all
service jDaemon_Manager start B

提供仅启动全部或仅1个特定实例的能力。

选项C: 多线程。您是否考虑过让当前守护程序在多线程模式下只运行一个实例,以便在不同的线程上同时运行相同的逻辑?这样你就只能运行一个守护进程。

这可能是一个可行的解决方案,因为线程可以相对独立地工作。

当然,这可能不适用于您的情况,但认为这是值得考虑的路线。

答案 2 :(得分:0)

我已经能够通过为每个实例使用不同的pid文件来运行守护程序的多个实例。还有不同的log_out和log_err文件,以便于跟踪。