Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
jsf和java中同步方法的最佳实践_Java_Ajax_Jsf - Fatal编程技术网

jsf和java中同步方法的最佳实践

jsf和java中同步方法的最佳实践,java,ajax,jsf,Java,Ajax,Jsf,我有一个JSF应用程序,用户在其中创建一些文件。问题是,他们必须上传并下载确认消息,上传/下载过程是独占的,一次只有一个用户,因为身份验证需要技术用户/密码。我的问题是,如何使等待过程对用户透明,这是一种协议,例如: 正在等待连接 认证 上传文件 下载确认文件 完成 使用单线程执行器 @ManagedBean @ApplicationScoped public class FileManager { private ExecutorService executor; @Po

我有一个JSF应用程序,用户在其中创建一些文件。问题是,他们必须上传并下载确认消息,上传/下载过程是独占的,一次只有一个用户,因为身份验证需要技术用户/密码。我的问题是,如何使等待过程对用户透明,这是一种协议,例如:

  • 正在等待连接
  • 认证
  • 上传文件
  • 下载确认文件
  • 完成

使用单线程执行器

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

} 
其中,
Result
就是包含所需结果的javabean对象,
Task
如下所示:

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

}
这样,所有任务都将由一个THAD以先进先出的顺序处理


如果您的容器支持EJB,那么还有其他方法。

谢谢,我将尝试一下
@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
        }
    }

    // ...
}