Я создаю приложение, в котором использую 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);
}
}
Теперь, чтобы закрыть его, есть несколько возможных способов:
- использовать awaitTermination (9, TimeUnit.HOURS) внутри самого метода configure
- Сделайте мой cutom executeotr bean-компонентом и закройте его из любого места в коде
- Объявите экземпляр ExecutorService threadPoolExecutor из метода и используйте какой-нибудь метод получения для его получения, а затем вызовите для него методы shutdDown из любой точки код.
Какой способ, по вашему мнению, будет более эффективным? В частности, я хочу спросить, было бы хорошей идеей сделать кастомного исполнителя в виде bean-компонента?