2014-09-12 2 views
2

dropwizard를 사용하여 마이크로 서비스를 제안하려고합니다. 설명서는 응용 프로그램을 시작하는 방법을 알려주지 만 정상적으로 종료하는 방법에 대해서는 설명하지 않습니다. 예를 들어, apache tomcat에는 시작 종료 스크립트가 있습니다.dropwizard 응용 프로그램을 종료하는 방법은 무엇입니까?

누구도 Ctrl+Ckill으로 누르는 것 이외의 dropwizard 응용 프로그램을 종료하는 방법을 알고 있습니까?

+0

'^ c'의 문제점은 무엇입니까? –

+0

@BoristheSpider AFAIK, 내가'^ C'을한다면, 받아 들인 모든 요청을 처리 한 후 부두가 끝나는 것이 보장되지 않습니다. 아니면 그렇지?만약 그렇다면 적절한 문서를 가르쳐 주시겠습니까? –

답변

9

Dropwizard Jetty에는 종료 후크가 있습니다. 따라서 kill -SIGINT <pid>은 실제로 잘 작동합니다.

자바에서
+0

주목할만한. 이것은 내 드롭 마법사 서비스 –

+0

죽이기 -15의 'init.d'스크립트에 통합되어 더 잘 작동합니다. 이유를 모르겠다. –

2

귀하의 개발 환경에 대한 질문이 아니라 귀하의 배포에 대한 질문입니다. 대답은 배포 전략에 따라 다릅니다. 과거에는 드롭 마법사 응용 프로그램이 시작될 수있는 Java 프로세스와 pid로 묶여 프로세스를 강제 종료하는 배포를 처리했습니다. 또는 upstart/init 스크립트에 java 프로세스를 번들하여 시스템을 정상적으로 시작하고 종료 할 수 있습니다.

반면에 dropwizard 응용 프로그램을 시작하면 결국 부두 서버가 시작됩니다. http://eureka.ykyuen.info/2010/07/26/jetty-stop-a-jetty-server-by-command. dropwizard 응용 프로그램을 시작할 때 중지 포트를 인수로 전달할 수있는 방법에 대해 설명합니다.

-3

:

// In case vm shutdown 
Runtime.getRuntime().addShutdownHook(new Thread() { 
    @Override 
    public void run() 
    { 
     // what should be closed if forced shudown 
     // .... 

     LOG.info(String.format("--- End of ShutDownHook (%s) ---", "APPLICATION_NAME")); 
    } 
}); 

는 종료 앱에 어떻게 자신의 전략을 구축 할 수 있습니다.

+2

Dropwizard에는 이미 이러한 종료 ​​훅이 있습니다. –

6

praveenag의 답변에 영감을 받아 방파제 코드를 파헤 쳤습니다.

당신이 제공 DropWizard를 시작하면

: Java 옵션으로

-DSTOP.PORT=xxxx -DSTOP.KEY=my_secret_key 

이 중지 요청에 대한 해당 포트에서 수신하도록 부두를 알려줍니다.

그러면 해당 소켓에 쓸 수 있으므로 Jetty에게 시스템 종료를 알릴 수 있습니다. 나는 이것을 이렇게 R에서 만들었습니다.

socket = make.socket("localhost", 8082) 
write.socket(socket, "my_secret_key\r\n") 
write.socket(socket, "stop\r\n") 
close.socket(socket) 

다른 언어에서도 똑같이 할 수 있습니다.

1

다른 답변은 훌륭하지만 스택을 조금 더 가야하고 사용자 지정 로깅/보안/임의의 복잡한 종료 논리를 쉽게 추가하려면 dropwizard 관리자 Task을 통해 종료 후크를 추가하는 것이 좋은 패턴입니다 .

그냥 당신이

import io.dropwizard.servlets.tasks.Task; 

public class ShutdownTask extends Task { 

    public ShutdownTask() { 
    super("shutdown"); // the task name, used in the endpoint to execute it 
    } 

    public void execute(
    ImmutableMultimap<String, String> immutableMultimap, 
    PrintWriter printWriter 
) throws Exception { 
    // kill the process asynchronously with some nominal delay 
    // to allow the task http response to be sent 
    new Timer().schedule(new TimerTask() { 
     public void run() { 
     // any custom logging/logic here prior to shutdown 
     System.exit(0); 
     } 
    }, 5000); 
    } 
} 

Application.run()

environment.admin().addTask(new ShutdownTask()); 

에 작업을 등록 후 관리 포트

에서 다음 엔드 포인트에 POST를 통해 그것을 실행 원하는 논리로 종료 작업을 코드
http://localhost:<ADMIN PORT>/tasks/shutdown