2010-05-10 12 views

risposta

12

Il FacesContext è memorizzato come variabile ThreadLocal nel thread responsabile della richiesta HTTP che invoca la FacesServlet, quello responsabile della creazione del FacesContext. Questo thread solitamente utilizza solo i metodi bean gestiti JSF. Lo FacesContext non è disponibile in altri thread generati da quel thread.

In realtà non si dovrebbe averne bisogno in altri thread. Inoltre, quando il thread si avvia e viene eseguito in modo indipendente, la richiesta HTTP sottostante continuerà immediatamente ad elaborare la risposta HTTP e quindi a scomparire. In ogni caso, non sarai in grado di fare qualcosa con la risposta HTTP.

È necessario risolvere il problema in modo diverso. Chiediti: per cosa ti serve? Per ottenere alcune informazioni? Basta passare che informazioni al Runnable durante la sua costruzione invece.

L'esempio seguente presuppone che si desideri accedere ad un oggetto con ambito sessione nella discussione.

public class Task implements Runnable { 

    private Work work; 

    public Task(Work work) { 
     this.work = work; 
    } 

    @Override 
    public void run() { 
     // Just use work. 
    } 

} 
Work work = (Work) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("work"); 
Task task = new Task(work); 
// ... 

Se però in ultima analisi, è necessario informare il cliente per esempio che il lavoro del thread è terminato, quindi dovresti cercare una soluzione diversa rispetto ad es. aggiungendo un messaggio volti o così. La risposta è usare "push". Questo può essere ottenuto con SSE o websocket. Un esempio concreto di websocket può essere trovato in questa domanda correlata: Real time updates from database using JSF/Java EE. Nel caso in cui si utilizzi PrimeFaces, consultare <p:push>. Nel caso in cui si utilizzi OmniFaces, consultare <o:socket>.


Estranei al problema concreto, creare manualmente Runnable s e la deposizione delle uova manualmente thread in un'applicazione Web Java EE è allarmante. Dirigetevi verso la seguente Q & A per conoscere tutte le avvertenze e come dovrebbe in realtà essere fatto: