JavaのサービスをApache commons daemonを使って起動する。

ようはOSの起動時にJavaのサービスを起動、そしてOSの停止時にJavaのサービスを停止したいということ。
ただし、OSはLinuxです。Windowsに関してはまだ調べていません・・・・

昔は、sudo で対応していましたが、sudoで起動スクリプトを立ち上げるとsudoがなんかエラーを出力して、
設定を変えればいいらしいが、それも面倒なので何とかアプリの方で吸収できる方法をとるために、
Apache commons daemonにトライした。
(ちなみに、sudo のどんなエラーかは忘れてしまいました・・・)

必要なライブラリ
Apache commons daemon download
から、Javaのライブラリと
Browse native binaries download area…
というリンクから、該当のバイナリをダウンロードします。(jsvcというプログラムです。)

JAVA側のプログラム

package com.coltware.java.samples.daemon;

public class JsvcService {
	
	public static DaemonSample service;
	
	public static void init(String args[]){
		service = new DaemonSample();
	}
	
	public static void start(){
		try{
			service.start();
		}
		catch(Exception ex){
			
		}
	}
	
	public static void stop(){
		try{
			service.stop();
		}
		catch(Exception ex){
			
		}
	}
	
	public static void destroy(){
		try{
			service.destroy();
		}
		catch(Exception ex){
			
		}
	}
}

このcommons daemonがstatic メソッドを必要としているために、そのメソッドを定義して、
その中で、実際のサービスのinit/start/stop/destoryをするようにしてください。
ちなみに、DaemonSample の実装は省略します。

さて、次にlinux用の起動スクリプト

#!/bin/sh
#

# Source function library.
. /etc/rc.d/init.d/functions

# default parameters

APP_HOME=`dirname $0`

JVM=server
JAVA_USER=apache
JAVA_MAIN_CLASS=com.coltware.java.samples.daemon.Service

JAVA_STDOUT=/var/log/java_server.log
JAVA_STDERR=/var/log/java_server.err

OS=linux

JAVA_HOME=${JAVA_HOME-/usr/java/default}

prog=java_server
pidfile=${PIDFILE-/var/run/java_server.pid}
lockfile=${LOCKFILE-/var/lock/subsys/java_server}
JSVC=$APP_HOME/bin/$OS/jsvc
RETVAL=0

JSVC_DEBUG="-debug"

### set classpathes ###
APP_CP=$APP_HOME/classes:$APP_HOME/res
for f in `ls $APP_HOME/libs`
do
	APP_CP=$APP_CP:$APP_HOME/libs/$f
done


JSVC_ARGS="-jvm $JVM -cp $APP_CP -home $JAVA_HOME -user $JAVA_USER "
JSVC_ARGS="$JSVC_ARGS -pidfile ${pidfile} -outfile $JAVA_STDOUT -errfile $JAVA_STDERR"
JSVC_ARGS="$JSVC_ARGS $JSVC_DEBUG"

start() {
  echo -n $"Starting $prog: "
  $JSVC $JSVC_ARGS $JAVA_MAIN_CLASS  
  echo 
  [ $RETVAL = 0 ] && touch ${lockfile}
  return $RETVAL
}

stop() {
  echo -n $"Stopping $prog: "
  $JSVC $JSVC_ARGS -stop $JAVA_MAIN_CLASS
  RETVAL=$?
  echo 
  [ $RETVAL = 0 ] && rm -f ${lockfile} ${pidfile}
  echo
}

case "$1" in
	start)
		start
		;;
	stop)
		stop
		;;
	restart)
		stop
		start
		;;
	status)
		status -p ${pidfile} $prog
		RETVAL=$?
		;;
	*)
		echo $"Usage: $prog {start|stop|status}"
		RETVAL=3
esac
exit $RETVAL

9行目でプログラムがある場所を指定しますが、ここではこのスクリプトがあるディレクトリをアプリケーションのルートとしてしまっています。

また、jsvcはlinux/jsvcにあることになっています。(25行目で指定)
18行目でOS=linuxとしているところで、linuxというディレクトリであることを決めています。
本来はここで適したjsvcのディレクトリを決めればいいのかと思います。

28行目でこのjsvcの起動/停止時の情報がいろいろと出てきます。(必要なければコメントアウトします。)

それ以外にもいろいろありますが、読んでいけばわかる範囲だと思います。

お仕事のご依頼・相談を承ります
この記事に関連するお仕事のご依頼やご相談をお待ちしております。 詳しくは、こちら

Leave a Reply

お仕事のご依頼・相談
この記事に関連するお仕事のご依頼やご相談をお待ちしております。 詳しくは、こちら
ソフトウェア&ライブラリ




ライブラリ
airxmail(en)
AIR版メール送受信ライブラリ
airxzip
AIR版ZIP圧縮・解凍ライブラリ
執筆書籍
本、雑誌等

WEB記事:CodeZine
執筆記事はこちら
カレンダー
2011年2月
« 1月   3月 »
 123456
78910111213
14151617181920
21222324252627
28  

カスタム検索
RSS
Add to Google < !–adsense–>
アーカイブ
カテゴリ
にほんブログ村 IT技術ブログへ