У меня есть приложение Spring Boot, которое порождает множество потоков с использованием AsyncTaskExecutor
(число предопределено)
Потоки выполняют бесконечный цикл, который читается из некоторых объектов очереди и обработки, поэтому у меня действительно нет механизма политики отклонения (например, ThreadPool, который принимает tasks
)
Проблема в том, что когда приложение закрывается, потоки могут (и, вероятно) быть заняты обработкой элемента, который включает в себя операции для Mongo с использованием MongoTemplate
.
Поэтому, когда приложение закрывается, MongoClient автоматически close()
обрабатывается, а затем я получаю некоторые ошибки от Mongo, например:
java.lang.IllegalStateException: The pool is closed
at com.mongodb.internal.connection.ConcurrentPool.get(ConcurrentPool.java:137)
at com.mongodb.internal.connection.DefaultConnectionPool.getPooledConnection(DefaultConnectionPool.java:262)
at com.mongodb.internal.connection.DefaultConnectionPool.get(DefaultConnectionPool.java:103)
at com.mongodb.internal.connection.DefaultConnectionPool.get(DefaultConnectionPool.java:92)
at com.mongodb.internal.connection.DefaultServer.getConnection(DefaultServer.java:85)
Как я могу закрыть приложение изящно? например прерывать потоки, пока не закрывая MongoClient?
КОД:
Создание бина:
@Bean
AsyncTaskExecutor getTaskExecutor() {
SimpleAsyncTaskExecutor executor = new SimpleAsyncTaskExecutor();
return executor;
}
Исполнение просто:
executor.execute(runnable);