Guice Injector使应用程序保持运行

时间:2017-09-28 21:16:51

标签: java jpa intellij-idea dependency-injection guice

我正在使用guice来注入我的依赖项。我的IDE是IntelliJ 2017.2.5。当我运行以下代码时,main方法继续运行并且不会停止。当我删除DI时,该过程将以Process finished with exit code 0停止。

使用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 个答案:

答案 0 :(得分:1)

您没有释放获取的资源(数据库连接和非守护程序线程)。

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注释或手动结束相应的工作单元(如上例所示)。

答案 1 :(得分:0)

您可能有一些打开的数据库连接/线程等待显式关闭 因为您正在使用Hibernate,所以请确保最后关闭()SessionFactory(如果这就是您正在使用的那个)

在IntelliJ中,您可以获取线程转储以查看哪些线程仍在运行/等待关闭

enter image description here

检查一下,看看你错过了什么

相关问题