Как отключить ThreadPoolExecutor в Spring Bean, когда Tomcat выключен? - PullRequest
2 голосов
/ 31 января 2012

Я создаю threadpoolexecutor в бобе Spring, поэтому мне нужно завершить работу этого исполнителя, когда tomcat завершает работу.

     public class PersistBO implements InitializingBean {

private ThreadPoolExecutor executer;

public void shutdownExecutor() {
    executer.shutdown();
}

@Override
public void afterPropertiesSet() throws Exception {
    taskQueue = new LinkedBlockingQueue<Runnable>(queueLength);
    executer = new ThreadPoolExecutor(minThread, maxThread, threadKeepAliveTime, 
            TimeUnit.SECONDS, taskQueue, new ThreadPoolExecutor.DiscardOldestPolicy());
}

Я искал решение в Google и получил результат.То есть добавить отключение в java.lang.runtime.Однако в документации по Java говорится, что java.lang.Runtime # shutdownHook вызывается при выходе из последнего потока, не являющегося демоном.Так что это мертвый замок.Есть ли решение для выключения исполнителя в бобе?

Ответы [ 5 ]

3 голосов
/ 31 января 2012

Я полагаю, что жизненный цикл исполнителя должен зависеть от жизненного цикла вашего приложения, а не от Tomcat в целом.Вы можете остановить свое приложение, пока Tomcat еще работает, поэтому Runtime.shutdownHook() неприменимо.

Поскольку вы уже используете Spring и его InitializingBean для инициализации, вы можете использовать DispasableBeanвыполнить очистку при закрытии контекста приложения:

public class PersistBO implements InitializingBean, DisposableBean { 
    public void destroy() {
        shutdownExecutor();
    }
    ...
}
0 голосов
/ 03 ноября 2015

Вот как запустить и остановить поток в бобе Spring.

    @PostConstruct
 public void init() {
  BasicThreadFactory factory = new BasicThreadFactory.Builder()
        .namingPattern("myspringbean-thread-%d").build();
  executorService =  Executors.newSingleThreadExecutor(factory);
  executorService.execute(new Runnable() {
   @Override
   public void run() {
    try {
     // do something
     System.out.println("thread started");
    } catch (Exception e) {
     logger.error("error: ", e);
    }

   }
  });
  executorService.shutdown();
 }


 @PreDestroy
 public void beandestroy() {
  if(executorService != null){
   executorService.shutdownNow();
  }
 }
0 голосов
/ 30 сентября 2014

Используйте аннотацию @Predestroy для вашего метода завершения работы на компоненте. это приведет к весеннему вызову этого метода, когда контекст отключится

Проверьте, есть ли в какой-либо службе исполнителя поток, работающий в фоновом режиме. Вы можете выключить исполнителя, позвонив executor.shutdownNow().

см. Также http://taranmeet.com/jvm-not-shutting-down-on-spring-context-close/

0 голосов
/ 31 января 2012

Вы можете реализовать свой собственный javax.servlet.ServletContextListener , чтобы получать уведомления о завершении работы приложения и отключать пул от прослушивателя.

0 голосов
/ 31 января 2012

Используйте Runtime, чтобы добавить отключающий крюк .Вот очень хороший урок от Хайнца Кабуца: http://www.roseindia.net/javatutorials/hooking%20_into_the_shutdown_call.shtml

...