2016-06-13 49 views
5

Sto sviluppando un'applicazione Java EE senza interfaccia http: utilizza solo MQTT per l'invio/ricezione di dati.Ambiti CDI nell'applicazione non http

Mi chiedo se CDI @SessionScoped e @RequestScoped si applicano a questo scenario o devo definire ambiti personalizzati per gestire le richieste del cliente.

Modifica

ho provato una semplice applicazione che inietta un @SessionScoped o @RequestScoped fagiolo nel MQTT ricevere richiamata e ho ottenuto un'eccezione dicendo che non ho contesto attivo.

È possibile attivare un contesto a livello di codice in modo che il ciclo di vita dei bean segua l'ambito scelto?

PS: quando posto la domanda che non ero troppo pigro per fare quel semplice test ma ero curiosi di approfondire in teoria portata CDI ... ed ancora io sono ..

risposta

2

C'è la possibilità che si è necessario creare il contesto di richiesta o di sessione.

Questa è ovviamente l'implementazione del CDI e l'applicazione specifica.

Ad esempio, se si utilizza Weld e si richiede Request Scope, è possibile creare e attivare org.jboss.weld.context.bound.BoundRequestContext.

 /* Inject the BoundRequestContext. */ 

    /* Alternatively, you could look this up from the BeanManager */ 

    @Inject BoundRequestContext requestContext; 


    ... 


    /* Start the request, providing a data store which will last the lifetime of the request */ 

    public void startRequest(Map<String, Object> requestDataStore) { 

     // Associate the store with the context and activate the context 

     requestContext.associate(requestDataStore); 

     requestContext.activate(); 

    } 


    /* End the request, providing the same data store as was used to start the request */ 

    public void endRequest(Map<String, Object> requestDataStore) { 

     try { 

     /* Invalidate the request (all bean instances will be scheduled for destruction) */ 

     requestContext.invalidate(); 

     /* Deactivate the request, causing all bean instances to be destroyed (as the context is invalid) */ 

     requestContext.deactivate(); 

     } finally { 

     /* Ensure that whatever happens we dissociate to prevent any memory leaks */ 

     requestContext.dissociate(requestDataStore); 

     } 

    } 

che si possono trovare informazioni e questo esempio qui https://docs.jboss.org/weld/reference/latest/en-US/html/contexts.html

Anche per BoundConversationContext. L'ambito della sessione è un po 'più difficile, per poterlo implementare è necessario un vero supporto di sessione nell'applicazione.

+0

grazie per la tua risposta! Ho letto la documentazione che hai collegato e ho trovato alcune informazioni utili. Sfortunatamente, non ho ancora capito come dovrei usare il 'BoundConversationContext': dovrei iniettare il contesto nel bean Voglio avere un ambito di richiesta e" copiare - incollare "il codice che hai postato? dovrei chiamare questi metodi dal mio codice o sono usati dal container? dovrei gestire il 'requestDataStore'? –

+0

È necessario associare e attivare il contesto dell'ambito prima di accedere al bean Scoped e disattivarlo dopo. Ciò significa che devi farlo fuori dal tuo fagiolo. Nel tuo caso puoi ad esempio creare un contesto di conversazione se qualche tipo di dati pari o ricevuti e disattivarli dopo il timeout. – temaleva