Play Framework: сделать Threadlocal согласованным для каждого запроса в асинхронных действиях

В Play Framework, если ваш код выполняется в Future, он переходит из одного потока в другой. У меня есть объект конфигурации, который создается для каждого запроса и должен храниться в файле Threadlocal. Однако, когда речь идет о будущем, значения Threadlocal больше не согласованы. Как мы пытаемся сделать Threadlocal согласованным на протяжении всего жизненного цикла запроса, даже если он перескакивает между разными потоками?

Спасибо


person user_1357    schedule 07.07.2014    source источник
comment
Вам действительно следует избегать такого глобального состояния, учитывая, что Play не имеет состояния. Если вам нужно что-то глобальное (например, пул соединений с БД), я бы рекомендовал создать плагин и поместить его туда: playframework.com/documentation/2.3.x/ScalaPlugins   -  person Ryan    schedule 07.07.2014
comment
На самом деле это не глобальное состояние, это состояние для каждого запроса. Если каждый запрос обрабатывался одним потоком, имеет смысл использовать threadlocal. Проблема здесь в том, что с асинхронными запросами threadlocal не является согласованным на протяжении всего срока службы запроса.   -  person user_1357    schedule 09.07.2014
comment
Если это для каждого запроса, зачем его нужно где-то хранить? Просто передайте его любой функции, которая нуждается в этом объекте. Неявные параметры хороши для этого.   -  person Ryan    schedule 09.07.2014


Ответы (1)


Вы можете использовать HttpExecutionContext. См. https://www.playframework.com/documentation/2.5.x/ThreadPools#java-thread-locals.

person Ashay Thorat    schedule 26.03.2017