【问题标题】:Spring Batch job execution status in response body响应正文中的 Spring Batch 作业执行状态
【发布时间】:2023-03-30 22:31:01
【问题描述】:

我对 Spring Batch 很陌生,很困惑

我有一个带有一些请求映射的控制器。当我获得某个 URL 时,我想将作业状态打印到响应正文中。这是一些代码:

@RequestMapping(value = "/batchExecution", method = RequestMethod.GET)
@ResponseBody
public String getJobExecutionStatus() {
    return "Hello world!";
}

我已尝试将 JobExecution 添加到方法中,但您只能使用 JobExecutionListener 访问这些元素吗?

@RequestMapping(value = "/batchExecution", method = RequestMethod.GET)
@ResponseBody
public String getJobExecutionStatus(JobExecution jobExecution) {
    return "Hello world!";
}

抱歉我的菜鸟问题,我找不到任何关于我正在寻找的文档

【问题讨论】:

  • 寻找 JobExplorer:docs.spring.io/spring-batch/trunk/apidocs/org/springframework/… 你可以自动装配它并得到你想要的一切。
  • @PospolitaNikita 我很困惑,要使用 JobExplorer 中的 getJobInstance,您需要提供一个 instanceId...您如何获得这个?
  • 你可以调用“.findJobInstancesByJobName”,然后获取任何JobInstance提供给“.getJobExecutions”
  • @PospolitaNikita 再一次,您必须提供工作名称、开始和计数?我不明白在不知道这些信息的情况下调用这些方法
  • 如果你使用 Spring Batch,你已经有了 JobName。只需查看此方法的实现即可了解“开始”和“计数”的含义。我认为您可以只使用 0 和 100 进行测试。检查文档的另一种途径 - docs.spring.io/spring-batch/trunk/reference/htmlsingle/… 所有 jobExecutions 都可以存储在 DB 中,因此您可以从那里获取这些信息。

标签: java spring spring-batch


【解决方案1】:

为了解决这个问题,我在原帖中的 Pospolita Nikita 的 cmets 的帮助下回答了我自己的问题。

我使用流程方法实现了一个服务,然后在我的程序控制器中调用了该方法。代码如下所示:

服务

@Override
    public String process(Long jobId) throws Exception {
        BatchStatus jobStatus = explorer.getJobExecution(jobId).getStatus();
        LOGGER.info("The Job ID is: " + jobId);
        LOGGER.info("The job status is: "+jobStatus);
        return null;
    }

控制器

@RequestMapping(value = "/batchMonitor/{id}", method = RequestMethod.GET)
    @ResponseBody
    public ResponseEntity<String> process(@PathVariable("id") Long id) {
        HttpHeaders responseHeaders = MccControllerUtils.createCacheDisabledHeaders();
        responseHeaders.setContentType(MediaType.TEXT_HTML);
        try {
            LOGGER.info("Obtaining job by ID " + id);
            String response = batchService.process(id);
            return new ResponseEntity<>(response, responseHeaders, HttpStatus.OK);
        } catch (Exception e) {
            LOGGER.error("Error obtaining batch by ID " + id, e);
            return new ResponseEntity<>(e.getMessage(), responseHeaders, HttpStatus.INTERNAL_SERVER_ERROR);
        }
    }

希望这可以帮助其他人。谢谢!

【讨论】:

    【解决方案2】:

    我建议您添加一个由控制器调用的服务并在其中运行批处理作业并返回执行状态以返回它

    【讨论】:

      猜你喜欢
      • 2020-11-23
      • 2014-12-10
      • 1970-01-01
      • 1970-01-01
      • 2021-12-10
      • 2019-11-21
      • 1970-01-01
      • 2015-11-25
      • 1970-01-01
      相关资源
      最近更新 更多