2017-12-04 2 views
1

이것은 매우 일반적인 문제이지만 E4에서도 실제 지원이없는 것 같습니다. (올바르게 기억한다면 E3에서도 작동하지 않습니다.)응용 프로그램 실행 코드 닫기

응용 프로그램이 닫힐 때 데이터베이스 연결을 닫으려고합니다. 또는 더 일반적인 : 나는 모든 종류의 정리를하고 싶습니다.

그래서 이것에 대한 일반적인 API는 다음과 같습니다

public class ApplicationWorkbenchWindowAdvisor extends WorkbenchWindowAdvisor { 

    public ApplicationWorkbenchWindowAdvisor(final IWorkbenchWindowConfigurer configurer) { 
     super(configurer); 
    } 

    @Override 
    public boolean preWindowShellClose() { 
     if (PlatformUI.getWorkbench().getWorkbenchWindowCount() <= 1) { 
      // the last window is about to close 
      Datababase.close(); 
     } 
     return super.preWindowShellClose(); 
    } 
} 

문제? 응용 프로그램이 닫힐 때마다 호출되지 않습니다. 특히 PlatformUI.getWorkbench().close(); (JavaDoc이이 메소드가 윈도우를 닫는다 고 주장하더라도)에서 호출되지 않습니다.

(이 주장이 맞다면 테스트 할 경우, 당신의 응용 프로그램을 닫습니다 ExitHandler를 사용 -. preWindowShellClose() 다음 호출되지 않습니다) 나는 내 자신의 핸들러를 작성 수동으로 청소를 부를 수

방법은 또 다시, 그러나 나는 더 나은 방법이 있기를 바라고 있었다.

Runtime.getRuntime().addShutdownHook(new Thread(() -> { 
    Datababase.close(); 
})); 

문제 :

당신이 응용 프로그램 종료에 반응 할 수있는 또 다른 방법은 Shutdown Hooks API 인 RCP 응용 프로그램이 후크는 방법, 방식이라고, 너무 늦게, 예를 모든 플러그인은 이미 닫혀 있습니다.

나는 단순하고 (작동하는) 방법이 있어야한다고 느낍니다. 아직 찾지 못했습니다. 중요한 경우 Lesser Evil Eclipse (일명 E3 호환성)를 사용하고 있습니다.

응용 프로그램이 종료 될 때마다 코드를 어떻게 실행합니까?

+0

'IWorkbench :: addWindowListener' 또는'IWorkbench :: addWorkbenchListener'를 사용해 보셨습니까? 이들이 안정적으로 작동하지 않는다면 번들의'stop' 메소드에서 정리 코드를 실행하는 것을 고려할 수 있습니다. 죄송합니다. 여기에 대해서만 추측 할 수 있습니다 ... –

+0

@ RüdigerHerrmann 아니요, 저는 이것을 시도하지 않았습니다. 둘 다 작동하는 것 같습니다. 그래서 나는 그것이 답이라고 생각합니다. –

답변

2

워크 벤치 창이 닫히거나 워크 벤치가 종료 될 때 알리려면 IWorkbench::addWindowListener 또는 IWorkbench::addWorkbenchListener을 사용하십시오.

번들의 stop 메소드에서 정리 코드를 실행하는 것도 좋습니다.