我正在尝试使用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)