废话少说,直接看代码吧,
startup向主程序传入一个启动命令,主程序启动socket侦听来等待关闭消息,shutdown.bat启动时,给主程序函数传入一个关闭命令,主函数向侦听socket端口发一个关闭消息。
startup.bat
set CURRENT_DIR=%cd% set EXECUTABLE=%CURRENT_DIR%/decs-run.bat
if exist "%EXECUTABLE%" goto okExec echo Cannot find %EXECUTABLE% echo This file is needed to run this program goto end
:okExec call "%EXECUTABLE%" start
:end
shutdown.bat
set CURRENT_DIR=%cd% set EXECUTABLE=%CURRENT_DIR%/run.bat
if exist "%EXECUTABLE%" goto okExec echo Cannot find %EXECUTABLE% echo This file is needed to run this program goto end
:okExec call "%EXECUTABLE%" stop
:end
run.bat
@echo off
rem excutable env check
if not "%JAVA_HOME%" == "" goto gotJdkHome if not "%JRE_HOME%" == "" goto gotJreHome echo Neither the JAVA_HOME nor the JRE_HOME environment variable is defined echo At least one of these environment variable is needed to run this program goto exit
:gotJreHome if exist "%JRE_HOME%/bin/java.exe" goto okJavaHome echo JAVA_HOME should point to a JDK in order to run. goto exit
:gotJdkHome if not exist "%JAVA_HOME%/bin/java.exe" goto noJavaHome set JRE_HOME=%JAVA_HOME% goto okJavaHome
:noJavaHome echo The JAVA_HOME environment variable is not defined correctly echo This environment variable is needed to run this program echo NB: JAVA_HOME should point to a JDK not a JRE goto exit
:okJavaHome
set CURRENT_DIR=%cd% set WEBINF_HOME = "..//..//..//" echo %WEBINF_HOME% cd %CURRENT_DIR%
set CLASSPATH=.;your-classpath
start java -classpath %CLASSPATH% Bootstrap "%1"
public class Bootstrap extends Thread{
static Logger log = Logger.getLogger(Bootstrap.class);
static final String HOST = "127.0.0.1";
static final int PORT = 5122;
static final String COMM_STOP = "stop";
static final String COMM_START= "start";
public void run(){
BufferedReader reader = null;
Socket socket = null;
Runner runner = new Runner();
try{
runner.start();
ServerSocket serverSocket = new ServerSocket(PORT);
socket = serverSocket.accept();
reader = new BufferedReader(new InputStreamReader( socket.getInputStream()));
while(true){
String s = reader.readLine();
if(COMM_STOP.equalsIgnoreCase(s)){
break;
}
yield();
}
System.exit(0);
}catch(Exception ex){ log.error(ex.toString());
}finally{
if( null != reader){
try{
reader.close();
}catch(Exception ex){
}
}
if( null != socket){
try{
socket.close();
}catch(Exception ex){
}
}
}
}
public static void main(String[] args) throws Exception{
if(null == args || args.length != 1){
System.exit(1);
}
String command = args[0];
if( COMM_START.equalsIgnoreCase(command) ){
( new Bootstrap()).start();
Runtime.getRuntime().addShutdownHook(new Thread(){
public void run(){
ImportWatcher.getInstance().Stop();
}
});
}else if(COMM_STOP.equalsIgnoreCase(command)){
Socket socket = null;
PrintStream out = null;
try{
socket = new Socket(HOST, PORT);
out = new PrintStream(socket.getOutputStream());
out.println(command);
}catch(Exception ex){
System.out.println(ex.toString());
}finally{
if(null != out){
out.close();
}
if( null !=socket){
socket.close();
}
}
}else{
log.error("unsupported:" + command);
}
}
final class Runner extends Thread {
private volatile boolean isStop = false;
public void run(){
while(!isStop){
try{
// 启动你的应用
}catch(Exception e){
log.error e);
break;
}
try {
sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public void close(){
isStop = true;
}
}
}