Используйте ThreadLocal для передачи области запроса данных - PullRequest
0 голосов
/ 19 мая 2019

Я сделал API отдыха Java 8 с помощью Spring Boot 2. Конечные точки контроллера могут быть помечены пользовательской аннотацией @DataAware.Существует активный HandlerInterceptor, который проверяет, сопоставлен ли текущий запрос методу с этой аннотацией.Если это так, я хочу, чтобы перехватчик проанализировал определенный заголовок запроса и сделал результирующий объект доступным во всем потоке, который обрабатывает этот запрос.

Например:

  1. Aзапрос содержит заголовок «specialData a: b: c»
  2. Конечная точка помечена @DataAware
  3. . DataInterceptor проанализирует заголовок и создаст объект List parsedData = "a","b" и "c".
  4. DataInterceptor будет делать что-то вроде ThreadForThisRequest.addProperty("data",myParsedData);
  5. В разных местах моего приложения классы и объекты должны иметь возможность ссылаться на parsedDataи значение, которое в данный момент активно в этом потоке, следует использовать.
  6. Когда в систему поступает другой запрос (возможно, одновременно), оба потока не должны видеть проанализированные данные друг друга.Если тот же поток используется повторно, предыдущие сохраненные данные должны быть удалены или переопределены

Я хотел использовать для этой цели MDC (Mapped Diagnostic Context), но это похоже на антипаттерн для хранения данных вотносительно скрытая «глобальная» контекстная карта.

Мне не нравятся свойства запроса, потому что тогда мне придется передавать объект запроса везде в моем приложении.Гораздо проще запрограммировать что-то, что выглядит как «публичный статический финал XXX», но на самом деле ограничено только этим запросом (потоком).

Я наткнулся на ThreadLocal и хотел быть уверен, что он делает то, что мне кажетсяделает.Если я введу следующее поле:

public static ThreadLocal<List<String>> requestSpecificData

Тогда каждый раз, когда мое приложение использует этот объект, будут передаваться только данные запроса THAT, поскольку каждый запрос обрабатывается собственным потоком?Делает ли Spring Web или Spring Boot встроенный Tomcat какие-то необычные вещи с потоками или пересылкой запросов (другим потокам?), Так что моя конечная точка контроллера может пропустить данные или увидеть данные предыдущих запросов вместо своих собственных?

...