资源甚至在计划任务完成执行之前就被销毁

时间:2019-06-07 14:32:58

标签: java spring multithreading transactions

我正在尝试使用ThreadPoolTaskScheduler安排一些任务执行,但是我注意到,即使在任务完成执行之前,Spring应用程序上下文也开始破坏所有资源。

    private JdbcTemplate jdbcTemplate;
    private TransactionTemplate transactionTemplate;
    private ThreadPoolTaskScheduler threadPoolTaskScheduler;

    public TestClass(final JdbcTemplate jdbcTemplate
                     final TransactionTemplate transactionTemplate,
                     final ThreadPoolTaskScheduler threadPoolTaskScheduler) {
    .... }

    public void start() {
            threadPoolTaskScheduler.execute(() -> {
                try {
                    // Try to claim the job. If the job is successfully claimed, then run the task.
                    claim(unitOfWork.getName()).ifPresent(this::runTask);
                } finally {
                    onComplete.accept(this);                    
                }
            });

private Job claim(final String code) {
....
... findJobByCode(code);
... updateJob(code);
}

private Job findJobByCode(final String code) {
....
transactionTemplate.execute((status) -> {
                        final String query = "select * from .... where...";

                        return jdbcTemplate.queryForObject(query,
                                                           (resultSet, rowNum) -> mapResultSetToJob(resultSet),
                                                           code);
                    }));

}

private int updateJob(final String code) {
....
transactionTemplate.execute((status) -> {
                        final String query = "update .... where...";

                        return jdbcTemplate.update(query, ...);
                    }));
....
}

以下是异常代码段,在该代码段中,我们可以看到任务调度程序正在执行,并且在这之间资源开始关闭。

需要一种方法来告诉Spring不要在计划执行Taks时关闭数据源和其他资源。

2019-06-07 18:44:00.261 INFO  [main] o.s.s.c.ThreadPoolTaskScheduler - Initializing ExecutorService 
2019-06-07 18:44:00.269 INFO  [ThreadPoolTaskScheduler-1] c.f.b.d.Test - Service instance [860d6991-08a2-493c-a8ff-7e5b8b029740] is trying to claim ASDF job. 
2019-06-07 18:44:00.269 INFO  [ThreadPoolTaskScheduler-1] c.f.b.d.Test - Service instance [860d6991-08a2-493c-a8ff-7e5b8b029740] is finding ASDF job record. 
2019-06-07 18:44:00.273 DEBUG [ThreadPoolTaskScheduler-1] o.s.o.h.HibernateTransactionManager - Creating new transaction with name [null]: PROPAGATION_REQUIRES_NEW,ISOLATION_READ_UNCOMMITTED,timeout_30 
2019-06-07 18:44:00.301 INFO  [Thread-2] com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Shutdown initiated... 
2019-06-07 18:44:00.316 INFO  [Thread-2] com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Shutdown completed. 
2019-06-07 18:44:00.318 ERROR [ThreadPoolTaskScheduler-1] o.s.s.s.TaskUtils$LoggingErrorHandler - Unexpected error occurred in scheduled task. 
org.springframework.transaction.CannotCreateTransactionException: Could not open Hibernate Session for transaction; nested exception is java.lang.IllegalStateException: EntityManagerFactory is closed
    at org.springframework.orm.hibernate5.HibernateTransactionManager.doBegin(HibernateTransactionManager.java:580)
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(AbstractPlatformTransactionManager.java:378)
    at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:137)
    at com.abc.Test.findJob(Test.java:175)
    at com.abc.Test..claim(Test.java:117)
    at com.abc.Test..lambda$start$0(Test.java:96)

创建线程2

"Thread-2@11628" prio=5 tid=0x27 nid=NA runnable
  java.lang.Thread.State: RUNNABLE
      at java.util.AbstractMap$2.iterator(AbstractMap.java:410)
      at java.lang.Iterable.forEach(Iterable.java:74)
      at org.springframework.orm.hibernate5.SpringBeanContainer.stop(SpringBeanContainer.java:136)
      at org.hibernate.resource.beans.internal.ManagedBeanRegistryImpl.stop(ManagedBeanRegistryImpl.java:118)
      at org.hibernate.service.internal.AbstractServiceRegistryImpl.stopService(AbstractServiceRegistryImpl.java:389)
      at org.hibernate.service.internal.AbstractServiceRegistryImpl.destroy(AbstractServiceRegistryImpl.java:372)
      - locked <0x2df9> (a org.hibernate.service.internal.SessionFactoryServiceRegistryImpl)
      - locked <0x2dfa> (a java.util.ArrayList)
      at org.hibernate.internal.SessionFactoryImpl.close(SessionFactoryImpl.java:826)
      at org.springframework.orm.hibernate5.LocalSessionFactoryBean.destroy(LocalSessionFactoryBean.java:651)
      at org.springframework.beans.factory.support.DisposableBeanAdapter.destroy(DisposableBeanAdapter.java:256)
      at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.destroyBean(DefaultSingletonBeanRegistry.java:571)
      at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.destroySingleton(DefaultSingletonBeanRegistry.java:543)
      at org.springframework.beans.factory.support.DefaultListableBeanFactory.destroySingleton(DefaultListableBeanFactory.java:1055)
      at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.destroySingletons(DefaultSingletonBeanRegistry.java:504)
      at org.springframework.beans.factory.support.DefaultListableBeanFactory.destroySingletons(DefaultListableBeanFactory.java:1062)
      at org.springframework.context.support.AbstractApplicationContext.destroyBeans(AbstractApplicationContext.java:1057)
      at org.springframework.context.support.AbstractApplicationContext.doClose(AbstractApplicationContext.java:1026)
      at org.springframework.context.support.AbstractApplicationContext$1.run(AbstractApplicationContext.java:945)
      - locked <0x2dfb> (a java.lang.Object)

0 个答案:

没有答案