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