如何提升tomcat的线程池的行为(how to enhance tomcat thread poo

2019-10-16 17:32发布

我使用tomcat7运行Java应用程序。 我需要存储每个Tomcat的线程的信息,这样我就可以使用ThreadLocals方法。

在我的server.xml中的线程池的定义如下所示:

 <Executor name="tomcatThreadPool" namePrefix="catalina-exec-" 
    maxThreads="10000" minSpareThreads="2000"/>

我有一个类EnhanceThread

public class EnhanceThread extends Thread {
    ...
    @Override
    public void run() {
       SomeThreadLocals.set(data);
       super.run();
     }
}

我如何可以覆盖Tomcat的线程池定义,使其使用用我的课? 是否有威胁更好的方法这个问题?

Answer 1:

你不需要惹Tomcat的线程这一点。 只需使用下面的代码:

public class JsonSerializerFactory {
    private static final ThreadLocal<JsonSerializer> JSON_SERIALIZER = 
        new ThreadLocal<JsonSerializer>() {
            @Override 
            protected JsonSerializer initialValue() {
                 return new JsonSerializer();
            }
        };

    public static JsonSerializer get() {
        return JSON_SERIALIZER;
    }
}

每次你需要一个串行时间,通话JsonSerializerFactory.get()它将返回线程本地实例,然后懒洋洋地创建它,如果不存在了。



Answer 2:

Tomcat的执行人是建立在java.util.concurrent类的顶部,这样你就可以取代Tomcat的组件类,但我不认为这是一个好主意。

如果你需要把数据放到请求的范围,也有一些明确的方式来做到这一点在Servlet规范,例如ServletRequestListener。 你也可以使用一个Servlet过滤器,并选择将其添加到只需要它的请求。



文章来源: how to enhance tomcat thread pool behaviour