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

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

相关问题