2014-12-16 4 views
1

Dropwizard와 Gradle을 사용하여 개발 된 프로젝트가 있습니다. 서버를 시작하고자 할 때 실행 설정으로 gradle run으로 IntelliJ IDEA 내에서 간단하게 실행할 수 있습니다.IntelliJ IDEA가 Dropwizard Server를 죽일 수 없습니다.

이렇게하면 내 서버가 시작되고 예상대로 작동 할 수 있습니다. IntelliJ로 디버깅을해도 문제가되지 않습니다.

그러나 "중지"또는 "재실행"버튼을 사용하면 이전에 시작한 서버를 죽이지 않는 것처럼 보입니다. 대신 서버를 다시 실행하면 다음과 같은 예외가 발생합니다.

13:45:48: Executing external task 'run'... 
:compileJava UP-TO-DATE 
:processResources UP-TO-DATE 
:classes UP-TO-DATE 
Connected to the target VM, address: '127.0.0.1:61376', transport: 'socket' 
:run 
INFO [2014-12-16 12:46:01,393] io.dropwizard.server.ServerFactory: Starting my-project 
Disconnected from the target VM, address: '127.0.0.1:61376', transport: 'socket' 
WARN [2014-12-16 12:46:01,552] org.eclipse.jetty.util.component.AbstractLifeCycle: FAILED [email protected]: java.lang.RuntimeException: java.net.BindException: Address already in use 

그래서 다른 프로그램에서 사용하려는 주소를 유지하는 것 같습니다. ps aux을 실행하면 서버가 여전히 실행 중이고 요청에 응답 함을 알 수 있습니다. 터미널을 통해 죽일 때만 또는 IntelliJ IDEA를 종료하면 서버가 종료됩니다.

개발하기에 좋지 않으므로 여기에서 몇 가지 지침을 찾고 있습니다.

+0

실제로 포트가 여전히 바인딩되도록 원래 인스턴스를 죽이지는 않습니다. IntelliJ의 Gradle을 통해 Spring 부트를 실행하는이 문제가있었습니다 - 표준 명령 줄 gradle을 통해 서버를 실행하고 시작하고 중지합니다. 왜 IJ가 그것을 놓아주지 않는지 잘 모르겠습니다. – cjstehno

+0

현재 터미널도 사용하고 있지만 디버거는 사용할 수 없습니다. 콘솔 출력 디버깅에 의존합니다. – akohout

답변

1

Intellij IDEA had (has?) a bug not being able to terminate gradle tasks.

당신이 Gradle을 2.1을 사용하지 않는 경우 2.1로 업그레이드하려고합니다. 그렇지 않으면 해결 방법은 파일에 재산

GRADLE.system.in.process=false 

을 추가하는 것입니다 'bin/idea.properties'

+0

여기서 언급 한 폴더 저장소는 어디에서 찾을 수 있습니까? – akohout

+0

제 경우에는 'C : \ Program Files (x86) \ JetBrains \ IntelliJ IDEA 커뮤니티 에디션 13.1.4 \ bin'입니다. 내 환경에 idea.properties가 없으므로 작성해야합니다. – Natan

+0

굉장! 내 grad 버전은 이미 up2date 였지만 옵션을 삽입하는 것이 작업을 수행하는 것 같습니다. 그래서 당신의 답을 해결책으로 받아 들였습니다. – akohout

0

편집 : 실제 솔루션에 대한 참조 나탄의 대답.

대답이 작동하지 않으면 다음 해결 방법이 있습니다. 응용 프로그램 클래스는 호출 될 때 단순히 서버를 종료하는 특별한 경로를 제공합니다. 이를 달성하기 위해 응답 in the google group을 기반으로 응용 프로그램에서 서블릿을 설정하고 경로를 정의한 다음 수신 대기합니다.

public class MyApplication extends Application<MyConfiguration> { 

    private static final Logger LOGGER = LoggerFactory.getLogger(MyApplication.class); 

    private Server mServer; 

    // ... 

    @Override 
    public void run(final RecommenderConfiguration configuration, 
       final Environment environment) throws ClassNotFoundException { 
     // ... 

     initializeKillCommand(environment); 
    } 

    private void initializeKillCommand(Environment environment) { 
     ServletEnvironment servletEnvironment = environment.servlets(); 
     servletEnvironment.addServlet(
       "Terminator", 
       new ServerTerminator() 
     ).addMapping("/kill"); 

     LifecycleEnvironment lifecycleEnvironment = environment.lifecycle(); 
     lifecycleEnvironment.addServerLifecycleListener(
      new ServerLifecycleListener() { 
       @Override 
       public void serverStarted(Server server) { 
        mServer = server; 
       } 
      } 
     ); 
    } 

    private class ServerTerminator extends HttpServlet { 
     @Override 
     protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 
      LOGGER.info("Received Shutdown Command"); 

      resp.setContentType("text/html"); 
      resp.setStatus(HttpServletResponse.SC_NO_CONTENT); 
      resp.getWriter().println(); 

      // Must initiate shut-down in separate thread to not deadlock here 
      new Thread() { 
       @Override 
       public void run() { 
        try { 
         mServer.stop(); 
        } catch (Exception ex) { 
         LOGGER.error("Unable to stop the server"); 
        } 
       } 
      }.start(); 
     } 
    } 
} 
관련 문제