Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Как улучшить поведение пула потоков tomcat

Автор вопроса: JuliasОтветов: 2

Я запускаю java-приложение, используя tomcat7. Мне нужно хранить информацию для каждого потока 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 и заставить его использовать мой класс? Есть ли лучший подход к решению этой проблемы?

  • Откуда берутся данные. Если все потоки имеют одинаковые данные, в чем смысл? Вы должны рассказать нам больше о своей конечной цели. Что вы ставите в треде локально? JB Nizet 20.05.2012
  • Я уверен, что все возможно, но, вероятно, существует более простое решение. Не могли бы вы объяснить, какую проблему вы хотите решить? AlexR 20.05.2012
  • Я хочу иметь сериализатор json в локальных потоках каждого потока, чтобы повысить производительность, а не создавать его для каждого запроса и не делать его одним централизованным объектом. Julias 20.05.2012
  • Как вы определили, что существует проблема с производительностью? Pidster 24.05.2012

javatomcatthreadpool

Ответы

Ответ 1 · рейтинг 1 · JB Nizet

Для этого вам не нужно возиться с потоками 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(), и он вернет локальный экземпляр потока и лениво создаст его, если он еще не существует.

Ответ 2 · Pidster

Tomcat Executor построен на основе классов java.util.concurrent, поэтому вы можете заменить классы компонентов Tomcat, но я не думаю, что это хорошая идея.

Если вам нужно поместить данные в область запроса, есть несколько хорошо определенных способов сделать это в Спецификации сервлета, например, ServletRequestListener. Вы также можете использовать фильтр сервлетов и выборочно добавлять его только к тем запросам, которые в нем нуждаются.

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы