如何增强tomcat线程池的行为

时间:2012-05-20 07:11:19

标签: java tomcat threadpool

我正在使用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线程池定义并使用我的类? 是否有更好的方法来威胁这个问题?

2 个答案:

答案 0 :(得分: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(),它将返回线程本地实例,如果它还不存在则懒惰地创建它。

答案 1 :(得分:0)

Tomcat Executor构建于java.util.concurrent类之上,因此可以替换Tomcat组件类,但我认为这不是一个好主意。

如果需要将数据放入请求范围,那么在Servlet规范中有许多明确定义的方法,例如ServletRequestListener。您还可以使用Servlet过滤器并有选择地将其仅添加到需要它的请求中。