1

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

4

2 回答 2

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

于 2012-05-20T12:36:55.343 回答
0

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

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

于 2012-05-24T19:54:07.003 回答