Завершение работы исполнителя Custom Thread Pool в grp c Spring boot - PullRequest
1 голос
/ 29 апреля 2020

Я создаю приложение, в котором использую Spring Boot для создания клиента и сервера gRP C. У меня есть требование, по которому я хочу закрыть свою службу через 9 часов. Это началось снова на следующий день. Для сервера grp c предоставляется пул потоков по умолчанию, но мы можем предоставить наш собственный пул потоков, вызвав serverBuilder.executor(our custom executor) Но когда мы предоставляем нашего пользовательского исполнителя, мы несем ответственность за его отключение.

Теперь, если мы не используем Spring Boot, мы можем вызвать shutDown () / shutDownNow () внутри нашего пользовательского метода, который мы используем для завершения нашего сервиса.

Но когда мы используем Spring Boot, мы предоставляем пользовательский executor как это

@Component
public class BootGrpcConfiguration extends GRpcServerBuilderConfigurer{

    @Override
    public void configure(ServerBuilder<?> serverBuilder) {
        ExecutorService threadPoolExecutor = Executors.newFixedThreadPool(1);
        serverBuilder.executor(threadPoolExecutor);

    }

}

Теперь, чтобы закрыть его, есть несколько возможных способов:

  1. использовать awaitTermination (9, TimeUnit.HOURS) внутри самого метода configure
  2. Сделайте мой cutom executeotr bean-компонентом и закройте его из любого места в коде
  3. Объявите экземпляр ExecutorService threadPoolExecutor из метода и используйте какой-нибудь метод получения для его получения, а затем вызовите для него методы shutdDown из любой точки код.

Какой способ, по вашему мнению, будет более эффективным? В частности, я хочу спросить, было бы хорошей идеей сделать кастомного исполнителя в виде bean-компонента?

1 Ответ

2 голосов
/ 29 апреля 2020

Вам нужно указать Spring, что делать, когда ваш компонент уничтожен, например:

@Component
public class BootGrpcConfiguration extends GRpcServerBuilderConfigurer{

    private ExecutorService threadPoolExecutor = Executors.newFixedThreadPool(1);

    @Override
    public void configure(ServerBuilder<?> serverBuilder) {
        serverBuilder.executor(threadPoolExecutor);

    }

    @PreDestroy
    public void destroy() {
        threadPoolExecutor.shutdown();
    }

}

Если вы создаете пул потоков в виде компонента, вы можете объявить там метод уничтожения:

@Configuration
public class AppConfiguration {

    @Bean(destroyMethod = "shutdown")
    public ExecutorService initializeExecutorService() {
        return Executors.newFixedThreadPool(1);
    }
}

Вам, конечно, понадобится специальный исполнитель, который не принимает новые задания в течение некоторого периода времени:

ExecutorService executorService = new ThreadPoolExecutor() {

    @Override   
    protected void beforeExecute(Thread t, Runnable r) {
        super.beforeExecute(t, r);
        // do some checks here
    }
 }
...