Ресурсы уничтожаются даже до завершения запланированного задания - PullRequest
0 голосов
/ 07 июня 2019

Я пытаюсь запланировать выполнение некоторой задачи, используя 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)
...