2012-05-10 8 views
5

Tengo una aplicación JSF donde los usuarios crean algunos archivos. El problema es que también deben cargarlos y descargar los mensajes de confirmación, y el proceso de carga/descarga es exclusivo, solo un usuario a la vez, ya que la autenticación requiere un usuario/contraseña técnico. Mi pregunta es, ¿cómo puedo hacer que el proceso de espera transparente para el usuario, una especie de protocolo, por ejemplo:Mejores prácticas en métodos sincronizados en jsf y java

  • la espera de obtener la conexión
  • autenticación
  • de carga de archivos
  • descarga de archivos de confirmación
  • hecho

Respuesta

3

utilizar un único ejecutor hilo.

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

} 

Dónde Result es sólo su objeto JavaBean que contiene el resultado deseado y Task tener este aspecto: (? Archivo cargado)

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 es sólo su objeto JavaBean que contiene los datos de entrada. Finalmente invocarla desde en su bean gestionado de la siguiente manera:

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

    // ... 
} 

De esta manera todas las tareas serán procesados ​​por una sola culata en T en la primera in - first out orden.

Si su contenedor admite EJB, existen otras formas.

+0

Gracias, lo intentaré –

Cuestiones relacionadas