2012-09-07 4 views
1

JConsole과 함께 MBean을 사용하여 원격으로 종료를 실행하는 경우이 예외가 발생하지 않도록하려면 System.exit(1)을 호출해야합니다. 종료가 호출되지 않을 때 아무 예외도 없다는 것을 확인 했으므로 다른 모든 것이 올바르게 설정되었습니다. 오류는 다음과 같습니다 확실히 의미가Java UnmarshalException on shutdown/JConsole를 통해 MBean에서 System.exit

Problem invoking shutdown: java.rmi.UnmarshalException: Error unmarshaling return header; nested exception is: java.io.EOFException

! 나는 이것이 단지 오류 상태가되기를 원치 않는다.

+0

오류를 정리 했습니까? –

답변

4

예상됩니다. JMX 작업이 System.exit(1)을 시작한 것이라고 가정합니다. Jconsole가 서버로부터의 응답을 기다리고 있었고 소켓이 닫히기 전에는 아무 것도 보내지지 않았다는 것을 의미합니다. 심지어 JMX를 통해 void 메서드를 호출해도 승인을 기다릴 수 있으므로 jconsole은 "메서드가 성공적으로 호출되었습니다"라고 말할 수 있습니다. 서버가 종료되므로 응답을받지 못하는 것이 좋습니다.

이 문제를 피하려면 스레드를 포크로 조금 잠근 다음 exit를 실행하십시오. 같은 뭔가 : 사용 사례에 따라

public String jmxShutdown() { 
    new Thread(new Runnable() { 
     public void run() { 
      try { 
       Thread.sleep(100); 
      } catch (InterruptedException e) { 
       // ignored 
      } 
      System.exit(1); 
     } 
    }); 
    return "Shutting down"; 
} 
+0

내 방법이 무효라도? – djechlin

+0

올바른 @djechlin입니다. void 메소드에서도 확인 응답을 기다리므로 jconsole이 "Method successfully invoked"라고 말할 수 있습니다. – Gray

0

, 또한 configure your own JMXConnectorServer에 가치가 대신 System.exit()를 호출의 JMX 방법에서 커넥터 서버를 중지 할 수있다. 수동으로 구성된 커넥터 서버가 사용자 스레드에서 실행 중이므로 서버가 중지되고 (실행중인 다른 사용자 스레드가없는 경우) JVM도 종료됩니다.

이 접근법의 장점은 커넥터 서버가 실행중인 모든 JMX 호출이 사용자 스레드를 릴리스하기 전에 정상적으로 처리되도록 보장하는 것입니다. 커넥터 서버에서 stop()을 호출하고 나중에 잠시 멈추는 테스트 MBean 메소드를 작성하여이 동작을 확인했으며, JMX 클라이언트에서 테스트 메소드를 호출 할 때 항상 응답을 얻었다.

+0

나는 OP _wants_가'System.exit (...) '으로 응용 프로그램을 종료한다고 생각합니다. – Gray

+0

그럼에도 불구하고 다른 해결책은 "JMX를 통해 프로세스를 종료하고 여전히 JMX 응답을 수신하는 방법"이라는 좀 더 일반적인 질문이있는 사람들에게 유용 할 수 있습니다. 나는이 질문에 OP 만 대답하는 것이 아닙니다. – oberlies