1

私のコードは、バックエンド サーバーからファイルをダウンロードします。数百万のレコードを取得するため、Struts2 execAndWaitInterceptor を使用しました。これをテストするために、30 秒の遅延を挿入しています。遅延を挿入せずにファイルをダウンロードできますが (テスト データが非常に小さい場合)、挿入後にファイルを取得できません。<meta-refresh>ログは、入力ストリームが入力されていても、待機ファイルで 5 秒のためにアクション クラスが繰り返し実行されていることを示しています。

そのような行動の理由は何でしょうか?

コードのセットアップ:

Struts.xml:

<action name="file-download" class="com.company.namespace.test.TestDownloadActionClass">
     <interceptor-ref name="defaultStack" />
     <interceptor-ref name="execAndWait">
         <param name="delay">10000</param>
         <param name="delaySleepInterval">500</param>
     </interceptor-ref>
     <result name="wait" type="freemarker" >/dir/resources/First-Page.ftl</result>
     <result name="error" type="freemarker" >/dir/resources/Error-Page.ftl</result>
     <result name="success" type="stream">
        <param name="contentDisposition">attachment; filename="${downloadFilename}"</param>
        <param name="contentType">application/vnd.openxmlformats-officedocument.spreadsheetml.sheet</param>
        <param name="inputName">inputStream</param> 
        <param name="bufferSize">1024</param>
    </result>
</action>

PS:このコードを何百万ものデータセットでテストしていません。テストデータは少数のデータのみで構成されています。

4

1 に答える 1

0

その理由は、execAndWaitインターセプターを間違った方法で使用しているためです。インターセプターはバックグラウンド スレッドでアクションを実行しています。アクションが実行されると、時間がかかる可能性がありますが、wait結果がブラウザーに返されます。結果が実行されると、応答がコミットされます。wait結果は、指定されたパラメーターの後に返されますdelay

パラメーター:

  • delay(オプション) - 待機ページが表示される前に待機するミリ秒単位の初期遅延 (待機を結果コードとして返す)。デフォルトは初期遅延なしです。
  • delaySleepInterval(オプション) - 遅延でのみ使用されます。バックグラウンド プロセスが既に完了しているかどうかを確認するために、特定の間隔でウェイクアップするために使用されます。デフォルトは 100 ミリ秒です。

初期パラメータがジョブを完了するのに十分な大きさのwait場合、結果は返されません。delay

このインターセプターは、初期待機遅延の使用もサポートしています。初期遅延は、待機ページがユーザーに表示されるまでサーバーを待機させるミリ秒単位の時間です。待機中、このインターセプターは 100 ミリ秒ごとにウェイクアップして、バックグラウンド プロセスが途中で完了したかどうかを確認します。したがって、何らかの理由でジョブがそれほど長くかからない場合、待機ページはユーザーに表示されません。

于 2015-02-24T08:10:04.337 に答える