2

私は Wicket を使い始めたばかりで (実際には多くの Web 開発に詳しくありません)、ダウンロード リンクに関して質問があります。ユーザーが特定のファイルをアップロードし、ファイル内の情報の一部を処理し、処理された情報のさまざまな形式のダウンロードを提供するだけの Web アプリがあります。しかし、これは私が取り組んでいるいくつかのソフトウェアの軽量バージョンであるはずなので、あまり処理をしたくありません。ユーザーがリンクをクリックして処理に20秒以上かかる場合、ダウンロードリンクのタイムアウトのようなものを設定する方法があるかどうか疑問に思っています.代わりは。ありがとう!

4

2 に答える 2

4

処理 (および処理の終了の可能性) はスレッドで行う必要があるという Xavi の意見に同意します。

ただし、特に数秒以上かかる場合は、接続を開いたまま待つのではなく、スレッドが完了したかどうかを定期的にチェックする方がはるかに優れています。

私はこのようなことをします:

  1. 実際の作業を行うスレッドを開始します
  2. Panel「ダウンロードを処理しています」などのメッセージを表示します。
  3. AbstractAjaxTimerBehaviorたとえば、10 秒程度のタイマー持続時間でパネルに を取り付けます。
  4. タイマー動作のonTimerメソッドで、処理の状態を確認します。
    • それでも機能する場合は、何もしません。
    • 時間がかかりすぎてキャンセルされた場合は、パネルを交換するか、警告ラベルを表示するように設定するなどして、「キャンセルされました」などのメッセージをユーザーに表示します。
    • 完了したら、「ダウンロードを開始しています」などのメッセージを表示して、ダウンロードを開始します。AJAX 応答を行うと同時にダウンロードを開始する方法については、このドキュメントを参照してください。
于 2012-09-13T09:38:54.147 に答える
2

一定以上の時間がかかった場合に処理をキャンセルできるようにするには、別のスレッドで実行するのが適切です。この問題は、次の質問で対処されます: How to timeout a thread .

Wicket の部分について: あなたが達成しようとしていることを理解していれば、たとえばLink、処理を実行する独自のロールを作成し、タイムアウトしない場合に結果を返すことができます。処理に時間がかかりすぎる場合は、単純にエラーをスローできます (エラーを表示FeedbackPanelできるようにすることを忘れないでください)。

LoadableDetachableModelダウンロードするファイルの処理または生成は、効率化のために に実装できます。詳細については、この質問を参照してください: How to use Wicket's DownloadLink with a file generated on the fly?

例えば:

IModel<File> processedFileModel = new LoadableDetachableModel<File>(){
    protected File load(){
        // Implement processing in a separate thread. 
        // If it times out it could return null, for instance
    }

}

Link<File> downloadLink = new Link<File>("yourID", processedFileModel) {
        @Override
        public void onClick() {
            File processedFile = getModelObject();
            if (file != null) {
                IResourceStream rs = new FileResourceStream(file);
                getRequestCycle().setRequestTarget(new ResourceStreamRequestTarget(rs));
            } else {
                error("Processing took too long");
            }
        }
    };
于 2012-09-12T22:31:50.240 に答える