我正在创建一个使用Spring Boot来构建gRPC客户端和服务器的应用程序。我有一个要求,我想在9小时后关闭我的服务。第二天又开始了。对于grpc Server,提供了一个默认线程池,但是我们可以通过调用来提供我们自己的自定义线程池,serverBuilder.executor(our custom 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);
}
}
现在要关闭它,有多种可能的方法:
您认为哪种方式会更有效?特别是我想问问,将自定义执行器变成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
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句