2012-05-10 12 views
5

Ho un'applicazione JSF in cui gli utenti creano alcuni file. Il problema è che devono caricarli e scaricare anche i messaggi di conferma e il processo di upload/download è esclusivo, solo un utente alla volta, perché l'autenticazione richiede un utente tecnico/password. La mia domanda è, come posso fare il processo in attesa trasparente per l'utente, una sorta di protocollo, per esempio:Best practice nei metodi sincronizzati in jsf e java

  • in attesa di ottenere la connessione
  • autenticazione
  • file di caricamento
  • download di file di conferma
  • fatto

risposta

3

utilizzare un unico esecutore thread.

@ManagedBean 
@ApplicationScoped 
public class FileManager { 

    private ExecutorService executor; 

    @PostConstruct 
    public void init() { 
     executor = Executors.newSingleThreadExecutor(); 
    } 

    public Result process(Task task) throws InterruptedException, ExecutionException { 
     return executor.submit(task).get(); 
    } 

    @PreDestroy 
    public void destroy() { 
     executor.shutdownNow(); 
    } 

} 

Dove Result è solo l'oggetto JavaBean che contiene il risultato desiderato e Task simile a questa: (? File caricato)

public class Task implements Callable<Result> { 

    private Data data; 

    public Task(Data data) { 
     this.data = data; 
    } 

    @Override 
    public Result call() throws Exception { 
     Result result = process(data); // Do your upload/download/auth job here. 
     return result; 
    } 

} 

Data è solo l'oggetto javabean che contiene i dati di input. Infine invocarlo dal nella vostra bean gestito nel modo seguente:

@ManagedBean 
@RequestScoped 
public class Bean { 

    @ManagedProperty("#{fileManager}") 
    private FileManager fileManager; 

    public void submit() { 
     try { 
      Data data = prepareItSomehow(); 
      Result result = fileManager.process(new Task(data)); 
      // Now do your job with result. 
     } 
     catch (Exception e) { 
      // Handle 
     } 
    } 

    // ... 
} 

In questo modo tutte le attività saranno trattati da un singolo thead nel primo in - first out ordine.

Se il contenitore supporta EJB, ci sono altri modi.

+0

Grazie, farò un tentativo –