2012-05-10 8 views
5

Ich habe eine JSF-Anwendung, wo die Benutzer einige Dateien erstellen. Das Problem ist, sie müssen sie hochladen und die Bestätigungsnachrichten herunterladen und der Prozess des Hochladens/Herunterladens ist exklusiv, nur ein Benutzer zu der Zeit, da die Authentifizierung einen technischen Benutzer/Passwort erfordert. Meine Frage ist, wie kann ich die Warte Prozess für den Anwender transparent zu machen, eine Art Protokoll, zum Beispiel:Best Practice in synchronisierten Methoden in JSF und Java

  • warten, um die Verbindung
  • Upload-Datei
  • herunterladen Bestätigungsdatei
  • Authentifizierung zu erhalten

Antwort

3

einen einzigen Thread Exekutor Gebrauch erfolgt.

@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(); 
    } 

} 

Wo Result nur Ihre javabean Objekt enthält, um das gewünschte Ergebnis und Task wie folgt aussehen: (hochgeladene Datei)

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 ist nur Ihre javabean Objekt mit den Eingabedaten. rufen Sie es schließlich aus in Ihrem Bean wie folgt verwaltet:

@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 
     } 
    } 

    // ... 
} 

von einem einzigen Thead im ersten Auf diese Weise alle Aufgaben abgearbeitet werden in - first out Reihenfolge.

Wenn Ihr Container EJB unterstützt, gibt es andere Möglichkeiten.

+0

Danke, ich werde es versuchen –