当我关闭服务器时,我有一些工作正在填充下载和填充数据,我希望这些工作可以优雅地完成。
我尝试添加 Runtime.getRuntime().addShutDownHook() 但这似乎在 Entitymanager 已经关闭之后运行,因为在运行之前异常开始涌入。
然后我尝试添加它来实现 ServletContextListener 并
@Override
public void contextDestroyed(ServletContextEvent servletContextEvent)
它在关闭挂钩之前运行,但仍在实体管理器关闭之后运行。
有没有办法在实体管理器关闭之前运行一些逻辑?
我正在使用注入实体管理器
@PersistenceContext(unitName = PERSISTENCE_UNIT)
private EntityManager entityManager;
EntitymanagerFactory 是使用创建的
@Configuration
@Bean(name= PERSISTENCE_UNIT)
.... createEntityManagerFactory()
当实体管理器关闭时,我如何正确监听,以便我可以允许挂起的工作首先完成?
我在 Java EE 上使用 Spring、Hibernate、JPA 和 Web 模块。
产生的异常是这样的:
java.lang.IllegalStateException: EntityManagerFactory is closed
org.hibernate.jpa.internal.EntityManagerFactoryImpl.validateNotClosed(EntityManagerFactoryImpl.java:388)
org.hibernate.jpa.internal.EntityManagerFactoryImpl.internalCreateEntityManager(EntityManagerFactoryImpl.java:342)
org.hibernate.jpa.internal.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:313)
sun.reflect.GeneratedMethodAccessor62.invoke(Unknown Source)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
java.lang.reflect.Method.invoke(Method.java:497)
org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.invokeProxyMethod(AbstractEntityManagerFactoryBean.java:388)
org.springframework.orm.jpa.AbstractEntityManagerFactoryBean$ManagedEntityManagerFactoryInvocationHandler.invoke(AbstractEntityManagerFactoryBean.java:541)
com.sun.proxy.$Proxy51.createEntityManager(Unknown Source)
org.springframework.orm.jpa.EntityManagerFactoryUtils.doGetTransactionalEntityManager(EntityManagerFactoryUtils.java:285)
org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:252)
com.sun.proxy.$Proxy53.getDelegate(Unknown Source)