2013-04-23 9 views
-1

자바에서 간단한 웹 서버를 작성하려고하지만 멈추지 않습니다. 내가 jar 파일에 모든 코드를 포장의 .jar CLASS_NAME의 인수가 서버를 시작하고 중지 칭찬 * 자바 -cp를 사용왜이 서버를 멈출 수 없습니까?

public static void main(String... args) { 

    args = new String[]{"stop"}; 
    Server s = Server.getServerInstance(); 
    s.init(); 
    if (args.length > 0) { 
     for (int i = 0; i < args.length; i++) { 
      if (args[i].equals("start")) { 
        System.out.println(s); 
        s.start(); 
      } else if (args[i].equals("stop")) { 
        System.out.println(s); 
        s.stop(); 
      } 
     } 
    } 
} 

public class Server { 

private static Server serverInstance = null; 
private volatile boolean running = false; 
private Thread serverthread = null; 


private Server() {} 

public static synchronized Server getServerInstance() 
{ 
    if(serverInstance == null) 
    { 
     serverInstance = new Server(); 
    } 
    return serverInstance; 
} 

public void init() 
{ 
    Runnable r = new ServerThread(); 
    serverthread = new Thread(r); 
} 

public void start() 
{ 
    running = true; 
    if(serverthread!=null) 
    { 
     serverthread.start(); 
    } 
} 

public void stop() 
{ 
    running = false; 
    if(serverthread!=null) 
    { 
     try { 
      serverthread.join(1000); 
     } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 
} 

class ServerThread implements Runnable 
{ 
    @Override 
    public void run() { 
     while(running) 
     { 
      //some action here... 
      System.out.println("RUNNING.."); 
      try { 
       Thread.sleep(2000); 
      } catch (InterruptedException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 
    } 

} 

}

: 여기에 샘플 코드의 조각이다. 서버는 시작할 수는 있지만 중지 인수로 전달하여 중지 된 적이 없습니다. 나는 디버깅을했고, 부울 값이 결코 바뀌지 않는다는 것을 알았습니다. 왜죠? 어떻게하면 우아한 방법으로 stop 메소드를 구현할 수 있습니까? 감사 !!!!

+2

당신이 자바를 두 번 실행하면, 그것은 완전히 새로운 공정의의를 생성을 사용하는 것이 좋습니다. stop() '호출이 첫 번째 프로세스에서 시작된 호출에 연결되지 않습니다. – Thomas

+0

왜 '바람둥이'?? – leonbloy

+0

시작/정지 스크립트가 필요합니다. –

답변

0

코드에 따르면, 중지하려는 서버의 인스턴스가 실행중인 인스턴스가 아니라고 가정합니다.

대신 사용해보십시오.

public static void main(String... args) { 

    Server s = Server.getServerInstance(); 
    s.init(); 
    s.start(); 
    try { 
     Thread.sleep(5000); 
    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    } 
    s.stop(); 
} 

이렇게하면 서버가 시작되고 5 초 후에 닫습니다.

별도의 프로세스에서 실행중인 서버를 중지하려면 소켓과 같은 것을 사용하여 상호 프로세스 통신을 사용 가능하게 설정해야합니다.

+0

안녕 매드, 당신은 별도의 프로세스로 무엇을 의미합니까? 별도의 서버 클래스 인스턴스? 나는 싱글 톤을 사용하여 동일한 인스턴스를 얻을 수 있도록했습니다. 고마워. – Willie

+0

명령 줄 인수로'start'를 사용하여 프로그램을 그대로 (as is) 실행하십시오. 그것은 당신의 서버 인 스레드를 생성하는 프로세스를 생성합니다. 이 프로세스는 서버의 단일 인스턴스 만 생성 할 수 있습니다. 명령 줄 인수로'start'를 사용하여 다시 실행하면 서버 인 새 스레드가있는 새 프로세스가 작성됩니다. 이것이 당신이 그것을 막을 수없는 이유입니다. 프로그램을 실행할 때마다 작성한 다른 모든 프로세스/스레드에 대한 지식이없는 별도의 프로세스가 생성됩니다. – MadProgrammer

+0

감사합니다 Mad, 설명이 장면이되고 시작된 서버를 중지하라는 제안이나 아이디어가 있습니까? 명령으로? java 명령 "java -cp JAR_FILES BOOTSTRAP_CLASS_NAME args"를 사용하여 쉘 스크립트를 사용하려고합니다. 여기서 args는 [start, stop, status]입니다. – Willie

0

나는 당신이 (물론 자바 서버가 리눅스에서 실행되는 경우) 같은 스크립트

#!/bin/sh 

PROGRAM_NAME=servername 
PROGRAM_HOME=/usr/local/servername 
PIDFILE=/var/run/$PROGRAM_NAME.pid 

application_start() { 
    CMDLINE="/usr/lib/java/bin/java -jar $PROGRAM_NAME.jar" 
    echo -n "Starting $PROGRAM_NAME daemon: $CMDLINE" 
    cd $PROGRAM_HOME 

    /usr/lib/java/bin/java -classpath lib -jar $PROGRAM_NAME.jar & 
    ps -Ao pid,command | grep java | grep $PROGRAM_NAME.jar | awk '{print $1}' > $PIDFILE 
    echo 
} 

application_stop() { 
     echo -n "Stopping $PROGRAM_NAME daemon..." 

     if [ -r $PIDFILE ]; then 
       PID=`cat $PIDFILE` 
       if [ $PID -gt 0 ]; then 
         kill $PID 
         echo 
         sleep 1 
         fi 
       rm -f $PIDFILE 
     fi 
     killall $PROGRAM_NAME 
} 

application_restart() { 
    application_stop 
    sleep 1 
    application_start 
} 

case "$1" in 
'start') 
    application_start 
    ;; 
'stop') 
    application_stop 
    ;; 
'restart') 
    application_restart 
    ;; 
*) 
    echo "usage $0 start|stop|restart" 
esac 
+0

감사합니다. Alex는 이런 식으로 나를 부탁합니다. 전 쉘 스크립트를 사용할 수 있다는 것을 이해합니다. 이전에이 방법을 사용 했었지만 단순히 프로세스를 종료하는 것이 좋은 방법은 아닙니다. 섬기는 사람. 갑자기 죽은 모든 서비스가 데이터 손상이나 무언가를 가져올 수 있습니다 .. "서버를 멈추게하는 우아한 방법이 아닙니다."- 책에서이 인용문을 보았습니다. (어떻게 바람둥이가 작동하는지 ..) :) 그러나 여전히 감사합니다. – Willie

+0

어쩌면 죽일 신호를 잡아 : http://stackoverflow.com/questions/2541597/how-to-gracefully-handle-the-sigkill-signal-in-java –

+0

고마워 알렉스 .. 나는 아직도 배워야 할 것이 많다. 너희들 .. .. :) – Willie

관련 문제