Я создал API для отдыха Java 8, используя Spring Boot 2. Конечные точки контроллера можно аннотировать пользовательской аннотацией @DataAware
. Активен HandlerInterceptor, который проверяет, сопоставлен ли текущий запрос методу с этой аннотацией. Если это так, я хочу, чтобы перехватчик проанализировал определенный заголовок запроса и сделал результирующий объект доступным для всего потока, обрабатывающего этот запрос.
Например:
- Запрос содержит заголовок "specialData a:b:c"
- Конечная точка помечена
@DataAware
DataInterceptor
проанализирует заголовок и создаст объект List parsedData = "a", "b" и "c".DataInterceptor
сделает что-то вродеThreadForThisRequest.addProperty("data",myParsedData);
- В разных местах моего приложения классы и объекты должны иметь возможность ссылаться на parsedData, и следует использовать значение, активное в данный момент в этом потоке.
- Когда в систему поступает другой запрос (возможно, одновременно), оба потока не должны видеть разобранные данные друг друга. ЕСЛИ один и тот же поток используется повторно, предыдущие сохраненные данные должны быть удалены или переопределены.
Я хотел использовать MDC (сопоставленный диагностический контекст) для этой цели, но это похоже на антипаттерн для хранения данных в относительно скрытой «глобальной» контекстной карте.
Мне не нравятся свойства запроса, потому что тогда мне пришлось бы передавать объект запроса везде в моем приложении. Гораздо проще запрограммировать что-то, что выглядит как «публичный статический окончательный XXX», но на самом деле ограничено только этим запросом (потоком).
Я наткнулся на ThreadLocal и хотел убедиться, что он делает то, что я думаю. Если я введу следующее поле:
public static ThreadLocal<List<String>> requestSpecificData
Тогда каждый раз, когда мое приложение использует этот объект, будут предоставлены только данные ЭТОГО запроса, потому что каждый запрос обрабатывается своим собственным потоком? Делает ли встроенный Tomcat Spring Web или Spring Boot какие-то другие причудливые вещи с потоками или пересылкой запросов (в другие потоки?), Так что в моей конечной точке контроллера могут отсутствовать данные или видеть данные предыдущих запросов вместо своих собственных?