Spring 启动进度报告
Spring Boot Progress report
我希望能够在 Spring 中报告某个方法的进度。我使用了一个单独的 class 来存储当前状态,并使用 return 作为当前视图:
它看起来像这样:
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;
}
}
带有 /state 的方法会报告当前状态,所以我可以在站点上用 Ajax 调用它们。问题是,如果我启动长 运行 一个,状态报告请求将在长 运行 未完成之前完成。我认为 Spring 为每个请求使用单独的线程。我需要在 Spring 中实现线程吗?
如果我对长 运行 过程使用 @Async
注释,它会像我预期的那样工作,但我仍然不明白,为什么两个单独的 HTTP 请求会阻塞不同的方法彼此!
如果我在应该花费很长时间的方法上使用 @Async
注释,调用它的 HTTP 请求将立即得到响应,它会在后台 运行 而我可以像我预期的那样调用状态方法。即使它可以工作,我仍然不知道为什么如果没有异步执行它就不能工作。
如果要使用 @Async
注释,则必须将 @EnableAsync
注释放在 class 上,您使用 @SpringBootApplication
and/or @EnableAutoConfiguration
.
希望以后有人能提供更好的答案。
我希望能够在 Spring 中报告某个方法的进度。我使用了一个单独的 class 来存储当前状态,并使用 return 作为当前视图: 它看起来像这样:
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;
}
}
带有 /state 的方法会报告当前状态,所以我可以在站点上用 Ajax 调用它们。问题是,如果我启动长 运行 一个,状态报告请求将在长 运行 未完成之前完成。我认为 Spring 为每个请求使用单独的线程。我需要在 Spring 中实现线程吗?
如果我对长 运行 过程使用 @Async
注释,它会像我预期的那样工作,但我仍然不明白,为什么两个单独的 HTTP 请求会阻塞不同的方法彼此!
如果我在应该花费很长时间的方法上使用 @Async
注释,调用它的 HTTP 请求将立即得到响应,它会在后台 运行 而我可以像我预期的那样调用状态方法。即使它可以工作,我仍然不知道为什么如果没有异步执行它就不能工作。
如果要使用 @Async
注释,则必须将 @EnableAsync
注释放在 class 上,您使用 @SpringBootApplication
and/or @EnableAutoConfiguration
.
希望以后有人能提供更好的答案。