1

Web コンテナーから効率的にバッチ ジョブを実行する必要がある場合、 TaskExecutorインターフェイス (非同期バージョン)の別の実装を使用する必要があるという事実に出くわしたとき、私は Spring Batch のドキュメントを読んでいました。

HTTP 要求がバッチ ジョブをトリガーすると想定しています。そして、私が理解しているように、クライアントがJobLauncherインターフェースの run メソッドを介してジョブを起動すると、クライアントはJobExecutionオブジェクトが返されるのを待つ必要があり、典型的なバッチジョブは最後に何時間も実行されるため、これはおそらくジョブが同期的に実行される場合、あまり実現可能ではありません。現在、AsyncTaskExecutorは各ステップを個別のスレッドで実行し、UNKNOWN ステータスでJobExecutionオブジェクトをすぐに返します。

まず、クライアントサーバー接続の観点からこれがどのように機能するかを誰かに説明してもらえますか? いずれの場合も、クライアントはセッションを終了する前にバッチが終了するのを待たないでしょうか? または、クライアントはバッチ ジョブの終了ステータスを認識しませんか? バッチが終了するまで接続を維持しなければならないという問題全体に関係していますか?

例として、クライアントが、サーブレットのdogetメソッドによって処理される HTTP get 要求を送信する Web ページを持っているとします。このメソッドは、ジョブ ランチャーのrunメソッドを呼び出します。このメソッドはJobExecutionオブジェクトを返します。そして、話の残りは上記の通りです。

ありがとう、アディティア。

4

2 に答える 2

4

run メソッドを呼び出して JobExecution オブジェクトを受け取った後のサーブレットの動作に少し依存します。run が呼び出された後、 dogetメソッドが返されるだけであると仮定します。

非同期エグゼキューターを使用しない場合、ジョブ ランチャーでの run メソッドの呼び出しは同期的に実行されます。つまり、呼び出しは、バッチ ジョブが完了して JobExecution オブジェクトが返されるまで待機します。接続の観点から、クライアントの HTTP 接続は、バッチ ジョブ全体を通して開いたままになります。HTTP 接続は、サーブレットの doGet メソッドが戻ると (または、ファイアウォールやソケットの読み取りタイムアウトなど、何らかのレベルで何らかのタイムアウトが発生した場合はその前に) 閉じられます。

非同期エグゼキューターを使用する場合、run メソッドの呼び出しはすぐに返されます。その後、doGet メソッドが戻り、HTTP 応答がクライアントに送信され、接続が閉じられます (HTTP キープアライブがない場合)。

于 2011-10-04T13:19:18.787 に答える
0

Web コンテナ内からのジョブの実行

通常、ジョブはコマンドラインから起動されます。ただし、 からの起動の方が適している場合も多くありHttpRequestます。このようなユース ケースの多くには、レポート、アドホック ジョブの実行、および Web アプリケーションのサポートが含まれます。定義上、バッチ ジョブは長時間実行されるため、最も重要な懸念事項は、ジョブを非同期で起動することです。

ここに画像の説明を入力

ここで、Spring MVC コントローラーは、非同期で起動するように構成された を使用して Job を起動し、JobLauncherすぐに を返しますJobExecution。ジョブはまだ実行されている可能性がありますが、このノンブロッキング動作により、コントローラーはすぐに戻ることができます。これは、HttpRequest.

以下に例を示します。

@Controller
public class JobLauncherController {

    @Autowired
    JobLauncher jobLauncher;

    @Autowired
    Job job;

    @RequestMapping("/jobLauncher.html")
    public void handle() throws Exception{
        jobLauncher.run(job, new JobParameters());
    }
}

ソース

于 2017-06-19T01:40:44.607 に答える