我正在使用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
由于某种原因,应用程序在此之后仍在运行。我必须手动终止应用程序。
我该如何解决这个问题?
答案 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)