如何覆盖Spring Boot应用程序中的线程池
我正在编写下面的代码来覆盖线程池。但它不能正常工作。在spring boot应用程序启动中设置覆盖线程池的正确方法是什么。请注意,我的代码中没有对服务器实例的控制,因此实例化服务器不是满足我需要的解决方案如何覆盖Spring Boot应用程序中的线程池,spring,spring-boot,threadpool,Spring,Spring Boot,Threadpool,我正在编写下面的代码来覆盖线程池。但它不能正常工作。在spring boot应用程序启动中设置覆盖线程池的正确方法是什么。请注意,我的代码中没有对服务器实例的控制,因此实例化服务器不是满足我需要的解决方案 @Bean public EmbeddedServletContainerCustomizer getContainerCustomizer() { return (configurableEmbeddedServletContainer
@Bean
public EmbeddedServletContainerCustomizer getContainerCustomizer() {
return (configurableEmbeddedServletContainer) -> {
if (configurableEmbeddedServletContainer instanceof JettyEmbeddedServletContainerFactory) {
((JettyEmbeddedServletContainerFactory)configurableEmbeddedServletContainer).addServerCustomizers((server) -> {
QueuedThreadPool newPool = new QueuedThreadPool(10);
QueuedThreadPool oldPool = server.getBean(QueuedThreadPool.class);
server.updateBean(oldPool, newPool);
});
}
};
}
当我执行代码时,它抛出了下面的错误
线程“main”中出现异常
我也尝试了示例主代码,但它也给出了相同的错误
public class FileServer
{
public static void main(String[] args) throws Exception
{
Server server = new Server(9090);
QueuedThreadPool newPool = new QueuedThreadPool(10);
QueuedThreadPool oldPool = server.getBean(QueuedThreadPool.class);
server.updateBean(oldPool, newPool);
ResourceHandler resource_handler = new ResourceHandler();
resource_handler.setDirectoriesListed(true);
resource_handler.setWelcomeFiles(new String[]{ "index.html" });
resource_handler.setResourceBase(".");
HandlerList handlers = new HandlerList();
handlers.setHandlers(new Handler[] { resource_handler, new DefaultHandler() });
server.setHandler(handlers);
server.start();
server.join();
}
}
下面是一个在Jetty中使用属性和不同类型的线程池配置线程池的示例。在我的例子中,线程池是
InstrumentedQueuedThreadPool
@Configuration
public class CustomJettyConfiguration {
@Bean
public JettyEmbeddedServletContainerFactory jettyEmbeddedServletContainerFactory(
@Value("${server.port:8080}") final String port,
@Value("${jetty.threadPool.maxThreads:600}") final String maxThreads,
@Value("${jetty.threadPool.minThreads:10}") final String minThreads,
@Value("${jetty.threadPool.idleTimeout:5000}") final String idleTimeout) {
final JettyEmbeddedServletContainerFactory factory =
new JettyEmbeddedServletContainerFactory(Integer.valueOf(port));
// Tweak the connection pool used by Jetty to handle incoming HTTP connections
InstrumentedQueuedThreadPool instThreadPool =
new InstrumentedQueuedThreadPool(registry);
instThreadPool.setPrefix("jetty");
instThreadPool.setMaxThreads(Integer.valueOf(maxThreads));
instThreadPool.setMinThreads(Integer.valueOf(minThreads));
instThreadPool.setIdleTimeout(Integer.valueOf(idleTimeout));
factory.setThreadPool(instThreadPool);
...
return factory;
}
}
下面是一个在Jetty中使用属性和不同类型的线程池配置线程池的示例。在我的例子中,线程池是
InstrumentedQueuedThreadPool
@Configuration
public class CustomJettyConfiguration {
@Bean
public JettyEmbeddedServletContainerFactory jettyEmbeddedServletContainerFactory(
@Value("${server.port:8080}") final String port,
@Value("${jetty.threadPool.maxThreads:600}") final String maxThreads,
@Value("${jetty.threadPool.minThreads:10}") final String minThreads,
@Value("${jetty.threadPool.idleTimeout:5000}") final String idleTimeout) {
final JettyEmbeddedServletContainerFactory factory =
new JettyEmbeddedServletContainerFactory(Integer.valueOf(port));
// Tweak the connection pool used by Jetty to handle incoming HTTP connections
InstrumentedQueuedThreadPool instThreadPool =
new InstrumentedQueuedThreadPool(registry);
instThreadPool.setPrefix("jetty");
instThreadPool.setMaxThreads(Integer.valueOf(maxThreads));
instThreadPool.setMinThreads(Integer.valueOf(minThreads));
instThreadPool.setIdleTimeout(Integer.valueOf(idleTimeout));
factory.setThreadPool(instThreadPool);
...
return factory;
}
}
在SpringBoot2.x中,JettyEmbeddedServletContainerFactory已被SpringBoot2.x中的org.springframework.boot.web.embedded.jetty.JettyServletWebServerFactory取代,
JettyEmbeddedServletContainerFactory
已被org.springframework.boot.web.embedded.jetty.JettyServletWebServerFactory
替换。检查检查感谢您的快速回答。解决方案简单明了。感谢您的快速回答。解决方案简单明了。谢谢您的回答。请考虑添加一些描述性内容,例如在线源,如何迁移,等等…谢谢您的回答。请考虑添加一些描述性内容,例如在线源、如何迁移等等。