Spring Bootで特定のメソッドの進捗状況を報告したいと考えています。私は、私は現在の状態を保存し、現在のビューとして返し別々のクラスを使用: それは次のようになります。Spring Boot Progress report
public class SearchTableReloadState {
//STATIC STORAGE
public static long TABLE_ROW_COUNT = 0;
public static long CURRENT_OFFSET = 0;
public static long CURRENT_LIMIT = 0;
public static long DEFAULT_LIMIT = 20000;
public static void reset() {
TABLE_ROW_COUNT = 0;
CURRENT_OFFSET = 0;
CURRENT_LIMIT = DEFAULT_LIMIT;
}
public static void setDefaultLimit(long defaultLimit) {
DEFAULT_LIMIT = defaultLimit;
}
// VIEWMODEL
public long tableRowCount = 0;
public long currentOffset = 0;
public long currentLimit = 0;
public static SearchTableReloadState getState() {
SearchTableReloadState reloadState = new SearchTableReloadState();
reloadState.tableRowCount = TABLE_ROW_COUNT;
reloadState.currentOffset = CURRENT_OFFSET;
reloadState.currentLimit = CURRENT_LIMIT;
return reloadState;
}
}
および方法:
@RequestMapping(value = {"/manage/searchtable/reload/state"}, method = RequestMethod.GET)
public @ResponseBody SearchTableReloadState searchTableReloadState() {
return SearchTableReloadState.getState();
}
@ResponseStatus(HttpStatus.OK)
@RequestMapping(value = {"/manage/searchtable/reload"}, method = RequestMethod.GET)
public void searchTableReload() throws ResourceAlreadyExistsException, ParameterMissingIdException {
SearchTableReloadState.reset();
SearchTableReloadState.TABLE_ROW_COUNT = productDataReferenceDao.countJobReferences();
productDataReferenceDao.truncateSearchTable();
while (SearchTableReloadState.CURRENT_OFFSET < SearchTableReloadState.TABLE_ROW_COUNT) {
... long running task
....
SearchTableReloadState.CURRENT_OFFSET += SearchTableReloadState.CURRENT_LIMIT;
}
}
方法/状態となり現在の状態を報告するので、サイトでAjaxを呼び出すことができます。問題は、長時間実行した場合、長時間実行が完了しないと状態レポート要求は完了しません。私は、Springがリクエストごとに別々のスレッドを使用すると考えました。 Springでスレッディングを実装する必要はありますか?
長時間実行するプロセスで@Async
アノテーションを使用した場合、期待どおりに機能しますが、まだ理解していません。
私はそれがそのようにうまくいくと思ういけないいいえ、あなたはどこか別の問題を持っていますが、あなたが言及した方法で動作しますdoesntのそれは、あなたが春のログを開き、ここでそれらを投稿してください可能性があることを確認します。春のアペンダーにスレッドIDを追加して、リクエストを処理するために別のスレッドを使用することを確認することができる場合は – AntJavaDev
どうすればSpringブートのログにアクセスできますか?私はそれをIDEで実行していますので、実行中のプロセスがコンソールウィンドウに表示される内容を意味していますか? – appl3r
はい、あなたはlog4jを使用していますか? – AntJavaDev