【问题标题】:how to enhance tomcat thread pool behaviour如何增强tomcat线程池行为
【发布时间】:2012-05-27 03:24:33
【问题描述】:

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

【问题讨论】:

  • 数据从何而来。如果所有线程都有相同的数据,那有什么意义呢?你应该告诉我们更多关于你的最终目标。你在本地线程中放了什么?
  • 我确信一切皆有可能,但可能存在更简单的解决方案。你能解释一下你想解决什么问题吗?
  • 我想在每个线程的线程本地有一个 json 序列化程序以提高性能 - 不是每个请求都创建它,也不是让它成为一个集中的对象
  • 您如何确定存在性能问题?

标签: java tomcat threadpool


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

【讨论】:

  • 如果重新部署应用程序,这不会造成内存泄漏吗?也就是这些JsonSerializers什么时候被移除?
  • 非常好的答案,谢谢。关于重新部署 - 当前线程是否在重新部署中被破坏?
  • 一个很好的例子,说明为什么 Tomcat 必须添加 ThreadLocal 泄漏保护。这不是好的代码。
  • 仅仅因为 Tomcat 在以前的版本中无法正确处理这种正常而直接的代码并不会使其成为糟糕的代码。应用程序代码不应该处理重新部署问题。这就是应用服务器的作用。这就是应该使用 ThreadLocal 的方式。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2011-09-18
    • 1970-01-01
    • 2019-09-21
    • 1970-01-01
    • 2017-04-04
    • 1970-01-01
    • 2011-11-12
    • 2018-05-16
    • 1970-01-01
    相关资源
    最近更新 更多