gpt4 book ai didi

java - 在 grpc Spring boot 中关闭自定义线程池执行器

转载 作者:行者123 更新时间:2023-12-02 08:39:09 24 4
gpt4 key购买 nike

我正在创建一个应用程序,在其中使用 Spring Boot 构建 gRPC 客户端和服务器。我有一个要求,我想在 9 小时后关闭我的服务。第二天又开始了。对于grpc Server,提供了默认的线程池,但是我们可以通过调用serverBuilder.executor(我们的自定义执行器)来提供我们自己的自定义线程池但是当我们提供自定义执行器时,我们就有责任关闭它。

现在,如果我们不使用 Spring Boot,我们可以在自定义方法中调用 shutdown()/shutDownNow() 来终止服务。

但是当我们使用 Spring Boot 时,我们提供这样的自定义执行器

@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)
  2. 将我的自定义执行程序设置为一个 bean,然后从代码中的任何位置将其关闭
  3. 在方法外声明 ExecutorService threadPoolExecutor 实例,并使用某种 getter 来获取它,然后从代码中的任何位置调用它的 shutdowndDown 方法。

您认为哪种方式更有效率?我特别想问一下,将自定义执行器设置为 Bean 是否是一个好主意?

最佳答案

你需要告诉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();
}

}

如果您将线程池创建为 bean,那么您可以在那里声明 destroy 方法:

@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
}
}

关于java - 在 grpc Spring boot 中关闭自定义线程池执行器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61495567/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com