春の DeferredResult を使用して長時間実行されるトランザクションタスクを実行する方法を教えてもらえますか? ネットで利用可能な多くのチュートリアルを経験しましたが、Restベース以外のアプリケーションではドキュメントも例も明確ではありません。これは長いポーリングを必要としませんが、バックグラウンドでタスクを実行し、すぐにHTTP応答を返し、同じコントローラーメソッドへの後続の呼び出しは単に戻ります結果。いくつかの仮定を使用して、次のように作成しました
private static final Map<String, DeferredResult<ModelAndView>> deferredResults = new ConcurrentHashMap<>();
@RequestMapping(value = "longRunning", method = RequestMethod.POST)
public DeferredResult<ModelAndView> longRunning(@ModelAttribute LongRunningJob longRunningJob) {
String resultKey = longRunningJob.getKey();
DeferredResult<ModelAndView> result = deferredResults.get(resultKey);
if (result == null ) {
deferredResults.put(resultKey, result = new DeferredResult<ModelAndView>());
new Thread(runLongRunning(longRunningJob, result)).start();
}
result.onCompletion(() -> {
deferredResults.remove(resultKey);});
return result;
}
public Runnable runLongRunning((LongRunningJob newLongRunningJob, DeferredResult deferredResult) {
return () -> {
LongRunningJob returnJobValue = this.longRunningJobService.startLongRunningJob(newLongRunningJob); //startLongRunningJob is a transactional method
ModelMap modelMap = new ModelMap();
modelMap.put("returnJobValue", returnJobValue);
modelMap.put("message", "Success");
deferredResult.setResult(new ModelAndView("job-view", modelMap));
};
}
それは機能しますか、それともそれを処理するための他の良い方法はありますか? 競合状態になる可能性はありますか?