我正在使用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线程池定义并使用我的类? 是否有更好的方法来威胁这个问题?
答案 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过滤器并有选择地将其仅添加到需要它的请求中。