2017-09-28 187 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

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(); 
    } 
} 

}

如果我執行Test.main一切順利,JPA正確初始化,我看到下面的輸出:

EM open 
Done 

出於某種原因,應用程序在此之後仍在運行。我必須手動終止應用程序。 Screenshot

我該如何解決這個問題?

回答

2

你在做什麼不釋放獲得的資源(數據庫連接和非守護線程)。

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的確保您的close()在結束了一個SessionFactory(如果這是你使用的是什麼)

在的IntelliJ你可以得到線程轉儲,看看哪個線程仍在運行/等待被關閉

enter image description here

檢查,看看你錯過

+0

我不知道 - 謝謝你的提示! –

相關問題