Spring / Hibernate添加了一个在关闭EntityManagerFactory之前运行的关闭挂钩 - java

当我关闭服务器时,我有一些工作正在填充我希望允许正常完成的下载和数据填充。

我试图添加一个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,而且是TransactionManagerDataSource。这就是为什么您无能为力的原因,除了丢弃当前正在运行的批处理作业并只是不确认
未完成的项目。

解决方案是使用持久消息队列来记录任何未完成的工作。如果服务器关闭,则不应确认当前正在处理的消息,因此下次启动服务器时有机会对其进行重新处理。

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://…