Есть ли хороший способ получить доступ к элементам области запроса Guice из дочерних потоков и локально к этим потокам?

В настоящее время я работаю над продуктом, который мы настроили для использования guice-servlet. .

Для каждого запроса, который мы получаем, мы создаем кучу рабочих потоков, каждый из которых отключается и выполняет «задачу». Затем результаты этих задач объединяются для получения ответа.

Это довольно распространено/прямолинейно, но я никогда раньше не пытался жениться на Гайсе. К сожалению, мы оказались в ситуации, когда вам нужно заранее нарисовать весь график.

т. е. мы не можем выполнять какую-либо отложенную привязку в дочернем потоке, так как он попытается использовать материал в области запроса/сеанса, которого там нет.


Пара взаимосвязанных вопросов:

1) Было бы очень приятно иметь доступ к объектам в области запроса из наших потоков задач. Сначала меня соблазнил (и я поиграл) ServletScopes.transferRequest(), но был сдут следующим:

Поскольку объекты в области запроса обычно не являются потокобезопасными, вызываемый объект, возвращаемый этим методом, не должен запускаться в другом потоке, пока текущая область запроса не будет завершена. Возвращенный вызываемый объект будет заблокирован до тех пор, пока текущий поток не освободит область запроса.

Похоже, что это больше для постобработки в отдельном потоке (т.е. выполнить некоторую работу после того, как вы ответили), и опасения по поводу безопасности потоков действительны.

Может ли Guicy™ решить эту проблему, создав дочерний инжектор с отдельным модулем для всего, что связано только с задачами, и заполнив его вещами из области запроса, которые являются обязательными/неизменяемыми?

Читая это назад, это кажется немного неуклюжим/деспотичным, поэтому я, вероятно, ошибаюсь.

2) Как вы понимаете, было бы неплохо создать собственную область задач для наших рабочих потоков.

У меня что-то работало, когда я неправильно возился с ServletScopes.transferRequest()) НО CustomScopes не рекомендует создавать настраиваемые области:

Обычно пользователям не рекомендуется создавать собственные настраиваемые области видимости — встроенных областей должно быть достаточно для большинства приложений.

Есть ли лучший подход для определения области действия в наших потоках задач?

Заранее спасибо!!


person phippsnatch    schedule 20.05.2016    source источник
comment
Вы не предоставили никаких подробностей о том, сколько вещей вам нужно в дочерних потоках - если их не так много, можете ли вы извлечь их в потоке с областью запроса, а затем передать их своим дочерним потокам вручную? (Отмечу, что это немного противоречит цели DI-фреймворка...)   -  person Andy Turner    schedule 20.05.2016
comment
большинство не все. Грубая идея (без гарантии, что это действительно работает или является хорошей идеей): создайте пользовательскую область, которая не хранит свои объекты в локальных файлах потока, а просто ключ для общей карты, безопасной для потоков, которая их хранит. Затем установите ключ во всех потоках, которым необходимо совместно использовать область действия. Это должно снять ограничение, которое есть у трансфертов. Также сделайте ваши объекты с областью действия потокобезопасными, это не guice, который делает их небезопасными.   -  person zapl    schedule 20.05.2016
comment
См. мой ответ на stackoverflow.com/q/20505649/502399   -  person Tavian Barnes    schedule 20.05.2016
comment
Все сохраняется в локальных переменных потока. Весна такая же... это очень раздражает. Что бы ты ни делал, это будет некрасиво. Вам, вероятно, потребуется передавать переменные через параметры, как только вы разветвите свой поток запросов...   -  person Isaiah van der Elst    schedule 21.05.2016
comment
Спасибо @TavianBarnes!! Я поиграл с #continueRequest(), но они пометили его как устаревший в Guice 4 — они предполагают, что вместо этого люди хотят использовать #transferRequest() (мы этого не делаем). Мы действительно близки к первой точке вашего поста. Мы загружаем объект запроса jax-rs в поставщика с областью запроса, прежде чем создавать остальную часть нашего графа. Таким образом, поставщики для объектов области запроса могут напрямую вводить запрос jax-rs, чтобы получить то, что им нужно. то есть, используя continueRequest(), мы могли бы просто заполнить объект запроса и позволить guice повторно вычислить остальное :)   -  person phippsnatch    schedule 21.05.2016
comment
Привет @TavianBarnes - очень признателен.   -  person phippsnatch    schedule 21.05.2016