在 Spring Boot 中,您可以通过挂钩到 Tomcat 连接器来配置 Wrapper。看这个例子:
@Bean
public EmbeddedServletContainerFactory servletContainerFactory() {
TomcatEmbeddedServletContainerFactory factory = new TomcatEmbeddedServletContainerFactory();
factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
@Override
public void customize(Connector connector) {
AbstractProtocol protocolHandler = (AbstractProtocol) connector.getProtocolHandler();
TaskQueue taskqueue = new TaskQueue() {
@Override
public boolean offer(Runnable e, long timeout, TimeUnit unit) throws InterruptedException {
return super.offer(new MyRunnable(e), timeout, unit);
}
@Override
public boolean offer(Runnable o) {
return super.offer(new MyRunnable(o));
}
};
TaskThreadFactory tf = new TaskThreadFactory("artur-" + "-exec-", false, 0);
ThreadPoolExecutor e = new ThreadPoolExecutor(10, 10, 1000, TimeUnit.SECONDS, taskqueue);
taskqueue.setParent(e);
protocolHandler.setExecutor(e);
}
});
return factory;
}
这是我的自定义 Runable(这可以是任何包装器,我没有费心实现你的):
static class MyRunnable implements Runnable {
private Runnable r;
public MyRunnable(Runnable r) {
this.r = r;
}
@Override
public void run() {
System.out.println("Custom runable");
runInner();
}
void runInner() {
r.run();
}
}
这是我的导入:
import java.util.concurrent.TimeUnit;
import org.apache.catalina.connector.Connector;
import org.apache.coyote.AbstractProtocol;
import org.apache.tomcat.util.threads.TaskQueue;
import org.apache.tomcat.util.threads.TaskThreadFactory;
import org.apache.tomcat.util.threads.ThreadPoolExecutor;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.context.embedded.EmbeddedServletContainerFactory;
import org.springframework.boot.context.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory;
import org.springframework.boot.web.support.SpringBootServletInitializer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.FilterType;
import org.springframework.context.annotation.PropertySource;
这是做什么的:
Tomcat 连接器会自行初始化。您可以将执行程序设置为使用,在这种情况下,Tomcat 将停止创建自己的配置,而是使用您的配置。
通过覆盖队列中的报价方法,您有机会将您的Runnable 包装在任何自定义Runnable 中。就我而言,为了进行测试,我只是添加了Sysout 以查看一切是否正常。
我使用的Threadpool 实现是tomcat 默认值的精确副本(减去属性)。这样,行为保持不变,除了任何 Runnable 现在是您的委托包装器。
当我测试它时,我的控制台会打印:
Custom runable
我希望这就是你要找的。p>
我使用 spring boot,但这本质上是一个 tomcat 问题而不是一个 spring 问题。您可以根据具体情况调整解决方案。
-- 阿图尔