gpt4 book ai didi

java - Guice Injector 保持应用程序运行

转载 作者:行者123 更新时间:2023-12-02 12:11:52 24 4
gpt4 key购买 nike

我正在使用guice注入(inject)我的依赖项。我的IDE是IntelliJ 2017.2.5。当我运行以下代码时,我的 main 方法继续运行并且没有停止。当我删除 DI 时,进程会停止并显示进程已完成,退出代码为 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");
}
}

数据库模块:

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

如何解决这个问题?

最佳答案

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

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

关于java - Guice Injector 保持应用程序运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46478458/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com