2017-12-04 9 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()はその後、呼び出されません)

私は自分のハンドラを作成し、手動でクリーンアップ呼び出すことができます方法はもう一度、私はより良い方法があることを望んでいた。

あなたがアプリケーションのシャットダウンに反応できるもう一つの方法は、Shutdown Hooks API次のとおりです。

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

問題:RCPアプリケーションのために、このフックが道と呼ばれ、途中、あまりにも遅く、例えばすべてのプラグインはすでに閉じています。

私は単純な(そして働く)方法が必要であると感じ、私はそれをまだ見つけていません。重要な場合は、Lesser Evil Eclipse(別名E3互換)を使用しています。

アプリケーションが終了するたびにコードを実行するにはどうすればよいですか?

+0

'IWorkbench :: addWindowListener'または' IWorkbench :: addWorkbenchListener'を試しましたか?これらが確実に機能しない場合は、バンドルの 'stop'メソッドからクリーンアップコードを実行することを検討することができます。申し訳ありませんが、私はここでしか推測できません... –

+0

@RüdigerHerrmannいいえ、私はこれらを試していません。そして、両方がうまくいくようです。だから私はそれが答えだと思う。 –

答えて

2

IWorkbench::addWindowListenerまたはIWorkbench::addWorkbenchListenerを使用すると、ワークベンチウィンドウが閉じているときやワークベンチがシャットダウンしたときに通知を受け取ることができます。

バンドルのstopメソッドからクリーンアップコードを実行することも考えられます。

関連する問題