代码之家  ›  专栏  ›  技术社区  ›  user212926

Guice Injector保持应用程序运行

  •  0
  • user212926  · 技术社区  · 7 年前

    guice 注入依赖项。我的IDE是IntelliJ 2017.2.5。当我运行以下代码时 main 方法继续运行,不会停止。当我删除DI时,进程停止 Process finished with exit code 0 .

    主要的 方法:

    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

    EM open
    Done
    

    Screenshot

    我该如何解决这个问题?

    2 回复  |  直到 7 年前
        1
  •  1
  •   Alex Filatov    7 年前

    您没有释放获取的资源(DB连接和非守护进程线程)。

    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
      }
    }
    

    @Transactional 注释或手动结束相应的工作单元(如上例所示)。

        2
  •  0
  •   FearlessHyena    7 年前

    由于您使用的是Hibernate,请确保在最后关闭()SessionFactory(如果您使用的是SessionFactory)

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

    enter image description here

    看看你错过了什么