2017-01-31 6 views
2

私はSpring Boot 1.3.5 Webアプリケーション(Tomcat 8で動作します)を持っています。その機能の1つは、RESTを通じてサードパーティのAPIに連絡し、多くの冗長なジョブを起動することです30はユーザ入力に依存し、それぞれがforループ内で独自のREST呼び出しを持つ)。私はいくつかのパラメータでPOSTを使用してコントローラでこのロジックをすべて持っています。春とバックグラウンドスレッドの実行

私が必要とするのは、いくつかのパラメータ(ジョブID)が渡され、定期的に(〜30秒)別のAPIをポーリングしてジョブ出力をフェッチするAPIによって各ジョブが承認された後でバックグラウンドタスクを開始することですこれらのジョブは数秒から1時間かかることがあり、ジョブを取得するには3〜4秒かかり、長い文字列を解析する)、ステータスに基づいてビジネスロジックを実行します(現在はDBレコードの更新)

しかし、私はどちらかがある場合はTaskExecutorを使用するかどうか、またはこれにJavaのFuture構造を使用すべきかどうかはわかりません。私は並列にXスレッドを実行し、他のスレッドはサーバーに過負荷をかけないように待ち行列プールから利益を得るかもしれません。私が学び始めるために取ることができる例はありますか?私の既存のコードの

サンプル:

@RequestMapping(value={"/job/launch"}, method={RequestMethod.POST}) 
public ResponseEntity<String> runJob(HttpServletRequest req) { 
    for (int deployments=1; deployments <= deployments_required; deployments++) { 
     httpPost.setEntity((HttpEntity)new StringEntity(jsonInput)); 
     CloseableHttpResponse response = httpclient.execute(httpPost); 
     HttpEntity entity = response.getEntity(); 
     responseString = EntityUtils.toString(entity, "UTF-8"); 
     JsonObject jsonObject = new JsonParser().parse(responseString).getAsJsonObject(); 
     if (response.getStatusLine().getStatusCode() != 200) { 
      resultsNotOk.add(new ResponseEntity<String>(jsonObject.get("message").getAsString(), HttpStatus.INTERNAL_SERVER_ERROR)); 
      continue; 
     } 
     String deploymentId; 
     deploymentId = jsonObject.get("id").getAsString(); 
     // Start background task to keep checking the job every few seconds and find created instance IP addresses 
     start_checking_execution(deploymentId); 
    } 
} 

(はい、このコードは、より良いサービスに置かれるかもしれませんが、私はまだそれを移動していないされて、それが最初に建てられたそれは良いかもしれません。今それをする時間)

答えて

0

は、私はそれがロジック

で動作するようにあなたは)書き込みオブジェクトをターゲットに読んでソースを変換する(リーダー/プロセッサを定義することができます/ライター Spring Batch

のための作業だと言うだろう

JobOperatorを使用してジョブの状態を取得できます。 job status transitions

+0

私が必要とするのは、ジョブのステータスではなく、そのログの一部です。外部APIに問い合わせることができます(申し訳ありませんが、私はすでにこれを反映するために質問を編集しました) – fernandopcg

関連する問題