当我关闭服务器时,我有一些工作正在填充我希望允许正常完成的下载和数据填充。
我试图添加一个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()
当entitymanager被关闭时,我该如何正确聆听,以便可以先完成待处理的工作?
我正在通过Web模块在Java EE上使用Spring,Hibernate,JPA。
产生的异常是这样的:
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)
java大神给出的解决方案
当Spring应用程序上下文被破坏时,EntityManagerFactory
被关闭。
根据您记录的异常,运行中的主线程已检测到应用程序destroy事件,并且Spring shutdownHook将destroy事件传播到所有已注册的bean(包括EntityManagerFactory
)。
您可能有一个包含某些工作线程的批处理作业,这些工作线程不侦听应用程序destroy事件,因此它们继续执行,因此尝试使用封闭的EntityManager
创建EntityManagerFactory
。
因为应用程序上下文已被破坏,所以关闭的不仅是EntityManagerFactory
,而且是TransactionManager
和DataSource
。这就是为什么您无能为力的原因,除了丢弃当前正在运行的批处理作业并只是不确认
未完成的项目。
解决方案是使用持久消息队列来记录任何未完成的工作。如果服务器关闭,则不应确认当前正在处理的消息,因此下次启动服务器时有机会对其进行重新处理。
java:继承 - java有哪些替代继承的方法? java大神给出的解决方案 有效的Java:偏重于继承而不是继承。 (这实际上也来自“四人帮”)。他提出的理由是,如果扩展类未明确设计为继承,则继承会引起很多不正常的副作用。例如,对super.someMethod()的任何调用都可以引导您通过未知代码的意外路径。取而代之的是,持有对本来应该扩展的类的引用,然后委托给它。这是与Eric…
Java-如何将此字符串转换为日期? - java我从服务器收到此消息,我不明白T和Z的含义,2012-08-24T09:59:59Z将此字符串转换为Date对象的正确SimpleDateFormat模式是什么? java大神给出的解决方案 这是ISO 8601标准。您可以使用SimpleDateFormat simpleFormat = new SimpleDateFormat("yyyy-MM…
Spring MVC:如何获取请求的处理程序方法 - java我正在尝试根据Spring @RequestMapping注释方法上存在的注释实现一些逻辑。因此,我的方法中有一个HttpServletRequest实例,我想问一下spring“给我一个方法,该方法将被调用以处理此请求”,因此我可以使用反射API来询问是否存在我的注释,因此我可以更改处理。有什么简单的方法可以从Spring MVC获取此信息? java大神…
Spring Boot如何在POST之后返回响应 - java我想创建一个新客户并在创建客户后返回客户编号。客户编号必须是从50000开始的自动递增的唯一编号。到目前为止,我已经成功创建了一个客户,但是我不确定应该如何生成客户编号,将其保存到数据库中,并在触发POST时将其作为成功消息显示给用户。json下面是所需的响应;{ "customerNumber": "50002", …
在Spring Boot中如何在WebSSOProfileConsumerImpl中设置responseSkew属性值 - java我正在尝试将SAML OKTA集成到春季启动应用程序中。我需要在Spring Boot中使用以下bean设置:谁能帮我在Spring Boot的webSSOprofileConsumer bean中设置responseSkew属性。我只需要上面在基于注解的Spring Boot注入中提到的xml配置的等效Spring注入技术。我已经通过链接了:http://…