2017-09-28 6 views
0

私はguiceを使用して依存関係を挿入しています。私のIDEはIntelliJ 2017.2.5です。次のコードを実行すると、mainメソッドは実行を継続し、停止しません。 DIを削除すると、プロセスはProcess finished with exit code 0で終了します。Guice Injectorはアプリケーションの実行を維持します

mainメソッドを持つクラス:

public class Test { 

@Inject 
Provider<EntityManager> em; 

public void test() { 
    if(em.get().isOpen()) 
     System.out.println("EM open"); 
} 

public static void main(String args[]) { 
    final Injector injector = createInjector(new DatabaseModule()); 
    Test app = injector.getInstance(Test.class); 
    app.test(); 
    System.out.println("Done"); 
} 
} 

DatabaseModule:私はすべてがうまくいけTest.mainを実行した場合

public class DatabaseModule extends AbstractModule { 

private static final String PU_NAME = "my_pu"; 

@Override 
protected void configure() { 
    install(new JpaPersistModule(PU_NAME)); 
    bind(JPAInitializer.class).asEagerSingleton(); 
} 

@Singleton 
private static class JPAInitializer { 
    @Inject 
    public JPAInitializer(final PersistService service) { 
     service.start(); 
    } 
} 

}

、JPAが適切に初期化されると、私は以下を参照してください。出力:

EM open 
Done 

何らかの理由で、その後もアプリケーションが実行されています。アプリケーションを手動で終了する必要があります。 Screenshot

これを修正するにはどうすればよいですか?

答えて

2

あなたがいる逃したものを見るために

enter image description here

チェックをクローズするのを待って実行されているかを確認するために、スレッドダンプを取得することができます取得されたリソース(DB接続および非デーモンスレッド)を解放しません。

public class Test { 

    @Inject 
    Provider<EntityManager> em; 

    @Inject 
    UnitOfWork unitOfWork; 

    public void test() { 
    if(em.get().isOpen()) 
     System.out.println("EM open"); 
    unitOfWork.end(); // releases DB connection 
    } 

    public static void main(String args[]) { 
    final Injector injector = createInjector(new DatabaseModule()); 
    Test app = injector.getInstance(Test.class); 
    app.test(); 
    System.out.println("Done"); 
    injector.get(PersistService.class).stop(); // releases resources acquired by the underlying EntityManagerFactory 
    } 
} 

は、技術的にはちょうどPersistService、この場合には十分なはずですが、それはもはや必要いないとき、一般的にあなたがEntityManagerを閉じる必要がありますストーピング。 Guice JPAでこれを行うことになっている方法は、@Transactional注釈を使用するか、対応する作業単位を手動で終了するかのいずれかです(上記の例のように)。

+0

解決済み!ありがとう! –

0

あなたはおそらく、あなたは、Hibernateは必ず(近づける使用しているので、明示的に をクローズするのを待っているいくつかのオープンDB接続/スレッドを持っている)SessionFactoryの終わりに(それはあなたが使用しているものだ場合)

でIntelliJのあなたは、スレッドがまだ/あなたが

+0

私はそれを知らなかった - ヒントありがとう! –

関連する問題