2011-12-15 15 views
5

Se ho una richiesta ambito CDI fagiolo iniettato in un @MessageDriven bean utilizzando JMS, come sotto, posso supporre che un dato Foo esempio sarà usato solo da un singolo onMessage invocazione alla volta ?@RequestScoped CDI iniezione nel fagiolo @MessageDriven

In altre parole, nell'esempio qui sotto, posso tranquillamente utilizzare variabili membro nell'oggetto Foo per memorizzare lo stato di tutti subroutine, analogamente ad un bean gestito JSF @RequestScoped?

noti che è ok se stesso Foo oggetto viene riciclato in modo sequenziale da una onMessage chiamata al successivo, purché ogni MessageDrivenBean esempio ha il proprio Foo esempio tale che l'elaborazione due richieste contemporaneamente verrebbe isolato.

@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 = ...; 
    } 
} 

risposta

10

WRT l'ambito/contesto della richiesta, le specifiche CDI nella sezione 6.7.1 indicano che sarà attivo per un bean message driven che implementa MessageListener. Viene anche distrutto dopo la consegna del messaggio, quindi avrai una nuova istanza per ogni messaggio consegnato. Inoltre, la sezione 6.7.3 afferma che anche il contesto dell'applicazione è attivo (come ci si aspetterebbe). Gli ambiti conversazione e sessione non sono attivi.

+0

Fantastico. Questo è esattamente ciò che speravo, e ho confermato mettendo un contatore di istanze sull'oggetto iniettato. (Non stava facendo questo all'inizio e si è scoperto che ho importato l'annotazione '@ RequestScoped' da javax.faces invece del giusto javax.enterprise.) – wrschneider

1

Mi chiedo se questo funzionerà. Che tipo di protocollo intendi utilizzare con MDB?

Gli MDB vengono quasi sempre richiamati in modo asincrono (ad esempio tramite JMS), quindi non è presente alcuna richiesta attiva quando viene chiamato . In genere, gli MDB devono anche implementare un'interfaccia corrispondente al protocollo che stanno ascoltando (ad esempio, per JMS, l'MDB deve implementare javax.jms.MessageListener).

+0

sì, sto usando JMS. Chiarito nell'esempio sopra. In questo contesto, con "ambito di richiesta", sto davvero cercando di dire "non singleton" - in altre parole, un nuovo 'Foo' viene iniettato in ogni istanza MDB in modo tale che due gestori simultanei di' onMessage' non entrino in collisione. – wrschneider