5

ユーザーがいくつかのファイルを作成する JSF アプリケーションがあります。問題は、それらをアップロードし、確認メッセージもダウンロードする必要があり、認証には技術的なユーザー/パスワードが必要なため、アップロード/ダウンロードのプロセスは一度に 1 人のユーザーのみであるということです。私の質問は、ユーザーに対して待機プロセスを透過的にするにはどうすればよいか、たとえば次のようなプロトコルです。

  • 接続を待っている
  • 認証
  • ファイルをアップロードする
  • 確認ファイルのダウンロード
  • 終わり
4

1 に答える 1

3

シングル スレッド エグゼキュータを使用します。

@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 をサポートしている場合、他の方法があります。

于 2012-05-10T13:03:56.653 に答える