금번 RabbitMQ 관련 작업을 하다가 OS 상에 백그라운드로 해당 RabbitMQ 서비스를 띄우기 위해서 사용된 아파치 프로젝트 입니다.
해당 포스트는 유닉스 및 리눅스 계열의 OS에서 사용할 jsvc 를 정리하였습니다.
package com.interpark.daemon;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadFactory;
import org.apache.commons.daemon.Daemon;
import org.apache.commons.daemon.DaemonContext;
import org.apache.commons.daemon.DaemonInitException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.interpark.dbutil.ApacheDBCPInit;
import com.interpark.exception.NamedThreadsFactory;
import com.interpark.exception.ThreadExceptionHandler;
import com.interpark.rabbitmq.RabbitMqManager;
import com.interpark.rabbitmq.RabbitMqPublishThread;
import com.interpark.util.PropertiesUtil;
public class SendingDaemonMain implements Daemon {
private static Logger LOGGER = LoggerFactory.getLogger(SendingDaemonMain.class);
private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
@Override
public void init(DaemonContext context) throws DaemonInitException, Exception {
// TODO Auto-generated method stub
LOGGER.debug("RabbitMQ Sending Daemon Init...");
String[] args = context.getArguments();
if (args != null) {
for (String arg : args) {
LOGGER.debug(arg);
}
}
ApacheDBCPInit adb = ApacheDBCPInit.getInstance();
adb.initConnectionPool();
LOGGER.debug("RabbitMQ Sending Daemon init OK.");
}
@Override
public void start() throws Exception {
LOGGER.debug("RabbitMQ Sending Daemon Start...");
long userId = 2;
int threadMax = Integer.parseInt(PropertiesUtil.getValue("thread.sending.maxThread"));
run(userId , threadMax);
LOGGER.debug("RabbitMQ Sending Daemon Start OK.");
}
private void run(long userId , int threadMax) throws Exception {
// TODO Auto-generated method stub
ThreadFactory factory = new NamedThreadsFactory(new ThreadExceptionHandler("RabbitMQ Sending Thread"));
ExecutorService executorService = Executors.newFixedThreadPool(threadMax, factory);
for(int i = 0; i < threadMax; i++ ){
executorService.execute(new RabbitMqPublishThread(userId, executorService, true));
Thread.sleep(1000);//처음 한번을 시간을 줘서 쓰레드를 각각 실행
}
executorService.shutdown();
//shutdownRabbitMqManager(rabbitMqManager);
}
protected void shutdownRabbitMqManager(final RabbitMqManager rabbitMqManager) throws Exception
{
rabbitMqManager.stop();
LOGGER.debug("@@@@@@@@@@@@@@@@@@End ShutDown RabbitMq@@@@@@@@@@@@@@@@@@@@@@@@");
LOGGER.debug("Bye!");
System.exit(0);
}
@Override
public void stop() throws Exception {
// TODO Auto-generated method stub
LOGGER.debug("RabbitMQ Sending Daemon Stop...");
LOGGER.debug("RabbitMQ Sending Daemon Stop Ok.");
}
@Override
public void destroy() {
// TODO Auto-generated method stub
LOGGER.debug("RabbitMQ Sending Daemon Destory...");
System.exit(0);
LOGGER.debug("RabbitMQ Sending Daemon Destory Ok.");
}
}
15. 프로젝트 jar파일로 만든다(디펜던시까지 다 말 것).
mvn assembly:assembly -DdescriptorId=jar-with-dependencies
16. (15)번까지 수행하고 나서 jar프로젝트를 아래 sh프로그램 작성후 centos(linux)에서 돌리면 됩니다.
#!/bin/sh
echo "사용자이름 : " $USERNAME
echo "호스트이름 : " $HOSTNAME
echo "사용방법 : startPublishDaemon.sh start | stop"
JAVA_HOME=/usr/java/jdk1.8.0_121
JSVC=/usr7/commons-daemon/src/native/unix/jsvc
USER=nobody
DAEMON_HOME=/usr7/java
PID_FILE=$DAEMON_HOME/daemon.pid
OUT_FILE=$DAEMON_HOME/daemon.out
CLASSPATH=\
$DAEMON_HOME/commons-daemon-1.0.15.jar:\
$DAEMON_HOME/couponRabbitmq.jar
MAIN_CLASS=com.interpark.daemon.SendingDaemonMain
case "$1" in
start)
#
# Start Daemon
#
rm -f $OUT_FILE
$JSVC \
-user $USER \
-java-home $JAVA_HOME \
-pidfile $PID_FILE \
-outfile $OUT_FILE \
-errfile $OUT_FILE \
-cp $CLASSPATH \
-Ddev.env=publish \
$MAIN_CLASS
#
# To get a verbose JVM
#-verbose \
# To get a debug of jsvc.
#-debug \
exit $?
;;
stop)
#
# Stop Daemon
#
$JSVC \
-stop \
-nodetach \
-java-home $JAVA_HOME \
-pidfile $PID_FILE \
-outfile $OUT_FILE \
-errfile $OUT_FILE \
-cp $CLASSPATH \
$MAIN_CLASS
exit $?
;;
*)
exit 1;;
esac