ユーザーがいくつかのファイルを作成する JSF アプリケーションがあります。問題は、それらをアップロードし、確認メッセージもダウンロードする必要があり、認証には技術的なユーザー/パスワードが必要なため、アップロード/ダウンロードのプロセスは一度に 1 人のユーザーのみであるということです。私の質問は、ユーザーに対して待機プロセスを透過的にするにはどうすればよいか、たとえば次のようなプロトコルです。
- 接続を待っている
- 認証
- ファイルをアップロードする
- 確認ファイルのダウンロード
- 終わり
シングル スレッド エグゼキュータを使用します。
@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;
}
}
Data
入力データ(アップロードされたファイル?)を含むJavaBeanオブジェクトです。最後に、マネージド Bean から次のように呼び出します。
@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
}
}
// ...
}
このようにして、すべてのタスクが単一のスレッドによって先入れ先出しの順序で処理されます。
コンテナーが EJB をサポートしている場合、他の方法があります。