2013-06-25 2 views
2
@WebListener 
public class AllRequestsWebListener implements ServletRequestListener { 

    @Inject HttpRequestProducer producer; 

    public void requestInitialized(ServletRequestEvent sre) { 
    producer.requestInitialized(sre); 
    } 
} 

...Является ли нижеследующая инъекционная инъекция, не требующая применения?

@RequestScoped 
public class HttpRequestProducer { 
... 
} 

Я не знаю, HOWTO INJECT запрос-боб как метод-параметр, и поэтому я могу предположить, что он будет работать должным образом, когда инъекция Request-боб ThreadLocal. Может ли кто-нибудь объяснить мне, как это реализовано в потокобезопасной манере?

ответ

0

Интуиция на основе ответа

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

Я тестировал его, хотя это эмпирическое доказательство, но введенный HttpRequestProducer получает новый экземпляр каждого запроса.

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

функции поддержали ответ

Твердая часть была найти неопровержимые доказательства этого требования в спецификации.

Я изучил спецификацию CDI и не смог быстро найти убедительное доказательство того, что объект @RequestScoped является потокобезопасным (например, с использованием локального потока), однако я предполагаю, что компонент @RequestScoped использует ту же область действия, что и облачные объекты в Java EE 5: (см here)

в то эта статья интересна:

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

Одновременный доступ может возникнуть в нескольких ситуациях:

  • нескольких веб-компонентов с доступом объекты, хранящиеся в веб-контексте.

  • Несколько веб-компонентов, обращающихся к объектам, хранящимся в сеансе.

  • Несколько потоков в веб-компоненте, обращающихся к переменным экземпляра экземпляра. Веб-контейнер обычно создает поток для обработки каждого запроса. Если вы хотите убедиться, что экземпляр сервлета обрабатывает только один запрос за один раз, сервлет может реализовать интерфейс SingleThreadModel.Если сервлет реализует этот интерфейс, вам гарантируется, что ни один из двух потоков не будет выполняться одновременно в методе службы сервлета. A веб-контейнер может реализовать эту гарантию, синхронизируя доступ к одному экземпляру сервлета или поддерживая пул узлов и отправляя каждый новый запрос на бесплатный экземпляр . Этот интерфейс не предотвращает проблемы синхронизации , которые возникают из-за того, что веб-компоненты получают доступ к общим ресурсам, таким как переменные статического класса или внешние объекты. Кроме того, спецификация Servlet 2.4 обесценивает интерфейс SingleThreadModel.

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

1

То, что вы ввели в ваш bean-компонент, является прокси-сервером, представляющим реальную сделку. Прокси-сервер всегда будет перенаправлять вызов к правильному боба