我使用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的线程池定义,使其使用用我的课? 是否有威胁更好的方法这个问题?
你不需要惹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()
它将返回线程本地实例,然后懒洋洋地创建它,如果不存在了。
Tomcat的执行人是建立在java.util.concurrent类的顶部,这样你就可以取代Tomcat的组件类,但我不认为这是一个好主意。
如果你需要把数据放到请求的范围,也有一些明确的方式来做到这一点在Servlet规范,例如ServletRequestListener。 你也可以使用一个Servlet过滤器,并选择将其添加到只需要它的请求。