【问题标题】:Spring Boot Progress reportSpring Boot 进度报告
【发布时间】:2017-01-06 11:31:14
【问题描述】:

我希望能够在 Spring Boot 中报告某个方法的进度。我使用了一个单独的类,我将当前状态存储在其中并作为当前视图返回: 它看起来像这样:

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 请求会相互阻塞!

【问题讨论】:

  • 不,我不认为它是这样工作的,你在其他地方还有另一个问题,但是为了确认它不能按照你提到的方式工作,你能否打开 spring 日志,并将它们发布在这里.如果您可以将线程 id 添加到 spring appender 中,以检查它是否会使用另一个线程来处理请求
  • 如何访问 Spring Boot 的日志?我在 IDE 中运行它,所以你的意思是正在运行的进程打印到控制台窗口?
  • 是的,你在使用 log4j 吗?
  • 我使用的是Spring Boot的默认配置,我没有配置另一个Logger
  • 默认的 Spring Boot 记录器使用 application.properties。你创造了一个吗?

标签: java spring spring-boot progress


【解决方案1】:

如果我在应该需要很长时间的方法上使用@Async注解,调用它的HTTP请求将立即得到响应,它将在后台运行,我可以按预期调用状态方法.即使它可以工作,我仍然不知道为什么没有异步执行它就无法工作。

如果你想使用@Async注解,你必须将@EnableAsync注解放在你使用@SpringBootApplication和/或@EnableAutoConfiguration的类上。

希望以后有人能提供更好的答案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-04
    • 1970-01-01
    • 2019-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多