@RequestScoped инъекция CDI в bean-компонент @MessageDriven - PullRequest
6 голосов
/ 16 декабря 2011

Если у меня есть bean-объект CDI с областью запроса, внедренный в EJB @MessageDriven с использованием JMS, как показано ниже, могу ли я предположить, что любой данный экземпляр Foo будет использоваться только одним вызовом onMessage одновременно?

Другими словами, в следующем примере можно ли безопасно использовать переменные-члены в объекте Foo для хранения состояния в подпрограммах, аналогично управляемому компоненту JSF @RequestScoped?

Обратите внимание, что все в порядке, если один и тот же объект Foo будет перезагружен последовательно от одного вызова onMessage до следующего, при условии, что каждый экземпляр MessageDrivenBean имеет свой собственный экземпляр Foo, так что два запроса, обрабатываемые одновременно изолированы.

 @MessageDriven
 public class MessageDrivenBean implements MessageListener {
    @Inject 
    private Foo foo;

    public void onMessage(Message m) {
      foo.doSomething();
    }
 }

 @Named
 @RequestScoped
 public class Foo {
   private String property;
     public void doSomething() {
       property = ...;
     }
 }

Ответы [ 2 ]

11 голосов
/ 17 декабря 2011

WRT Область / контекст запроса, спецификация CDI в разделе 6.7.1 говорит, что он будет активен для управляемого сообщениями компонента, реализующего MessageListener. Он также уничтожается после доставки сообщения, поэтому у вас будет новый экземпляр для каждого доставленного сообщения. Кроме того, в разделе 6.7.3 говорится, что контекст приложения также активен (как и следовало ожидать). Области диалога и сеанса не активны.

1 голос
/ 16 декабря 2011

Интересно, будет ли это работать? Какой протокол вы собираетесь использовать с MDB?

MDB почти всегда вызываются асинхронно (например, через JMS), поэтому нет никакого понятия о каком-либо активном запросе, когда вызывается onMessage(). Обычно MDB также требуются для реализации интерфейса, соответствующего протоколу, который они слушают (например, для JMS MDB должен реализовывать javax.jms.MessageListener).

...