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