当前位置: 首页 > 知识库问答 >
问题:

在作业完成之前返回Spring Batch作业ID

禄光霁
2023-03-14

>

  • 我试图在作业完成之前返回Spring Batch作业ID。

    我当前的实现只在作业完成后返回信息。

    我使用批处理程序控制器和批处理服务,发布在下面。谢谢,我是新来的Spring Batch,经过详尽的搜索,找不到太多与我的问题相关的。有一个帖子有人使用Apache骆驼,但我没有。

    控制器

    @RequestMapping(value = "/batch/{progName}", method = RequestMethod.GET)
        public ResponseEntity<JobResults> process(@PathVariable("progName") String progName,
                                                  @RequestHeader("Accept") MediaType accept) throws Exception {
            HttpHeaders responseHeaders = MccControllerUtils.createCacheDisabledHeaders();
            responseHeaders.setContentType(MediaType.APPLICATION_XML);
            if(!accept.toString().equals("*/*")) {
                responseHeaders.setContentType(accept);
            }
            LOGGER.info("Running batch program " + progName);
            JobResults response = batchService.processProgName(progName);
            return new ResponseEntity<JobResults>(response, responseHeaders, HttpStatus.OK);
        }
    

    服务

    @Override
        public JobResults processProgName(String progName) throws Exception {
    
            String jobName = "call" + progName.toUpperCase() + "Job";
            JobExecution jobExecution = null;
            String result = "";
            Long jobId = null;
            JobResults results = new JobResults();
            BatchStatus jobStatus = null;
            try {
                // Launch the appropriate batch job.
                Map<String, Job> jobs = applicationContext.getBeansOfType(Job.class);
                LOGGER.info("BATCHSTART:Starting sync batch job:" + jobName);
                JobParametersBuilder builder = new JobParametersBuilder();
                // Pass in the runtime to ensure a fresh execution.
                builder.addDate("Runtime", new Date());
                jobExecution = jobLauncher.run(jobs.get(jobName), builder.toJobParameters());
                jobId = jobExecution.getId();
                jobStatus = jobExecution.getStatus();
                results.setName(jobName);
                results.setId(jobId);
                results.setMessage("The job has finished.");
                results.setStatus(jobStatus);
                LOGGER.info("The job ID is " + jobId);
                LOGGER.info("BATCHEND:Completed sync batch job:" + jobName);
                LOGGER.info("Completion status for batch job " + jobName + " is " + jobExecution.getStatus().name());
                List<Throwable> failures = jobExecution.getAllFailureExceptions();
                if (failures.isEmpty()) {
                    result = jobExecution.getExecutionContext().getString(AbstractSetupTasklet.BATCH_PROGRAM_RESULT);
                } else {
                    for (Throwable fail : failures) {
                        result += fail.getMessage() + "\n";
                    }
                }
                LOGGER.info("The job results are: " + result);
            } catch (JobExecutionAlreadyRunningException | JobRestartException | JobInstanceAlreadyCompleteException
                    | JobParametersInvalidException e) {
                throw new RuntimeException("An error occurred while attempting to execute a job. " + e.getMessage(), e);
            }
            return results;
        }
    

    再次感谢。

    编辑

    我已将其添加到批处理配置中

    @Bean(name = "AsyncJobLauncher")
        public JobLauncher simpleJobLauncher(JobRepository jobRepository){
            SimpleJobLauncher jobLauncher = new SimpleJobLauncher();
            jobLauncher.setJobRepository(jobRepository);
            jobLauncher.setTaskExecutor(new SimpleAsyncTaskExecutor());
            return jobLauncher;
        }
    

    编辑

    在马哈茂德·本·哈辛的评论的帮助下,我解决了这个问题:)

    我必须从服务中删除结果变量和信息,并添加上面看到的代码。当我到达我的endpoint时,我立即收到工作信息。

  • 共有1个答案

    何承
    2023-03-14

    您可以做的是在您的批处理服务中注入一个JobLauncher实现,该实现由异步任务执行器(例如SimpleAsyncTaskExecutorThreadPoolTaskExecutor)支持。这将异步运行作业,并立即返回作业执行(您可以从中获取id),而无需等待作业完成。

    因此,通过在BatchService中注入正确的JobLauncher实现,您将能够实现您的需求,而无需更改processProgName方法的代码。

    您可以在这里找到有关如何同步或异步运行作业的更多详细信息:https://docs.spring.io/spring-batch/4.0.x/reference/html/job.html#configuringJobLauncher

     类似资料:
    • 我正在做一个项目,我们正在使用Spring Boot、Spring Batch和Camel。 关于如何在JobExecution数据可用时立即返回它,有什么想法吗?

    • 我正在使用IPP协议与CUPS通信。我的打印机的所有驱动程序都安装在CUPS中(使用.ppd文件),打印机得到了最新的固件。 当我查询一个打印机正在打印的作业时,它表示该作业的状态在打印机完成打印之前就已经“完成”。CUPS似乎在完成文件“上传”后将作业标记为“完成”。 我不希望出现这种行为,我基本上需要知道打印机何时打印出作业的最后一张纸。代码如下所示。自身。打印机()。ippPrinter()

    • 我试图理解Python线程的“守护进程”标志。这我知道 线程可以标记为“守护线程”。此标志的意义在于,当只剩下守护进程线程时,整个Python程序将退出。初始值从创建线程继承。 但在我的例子中,python程序在守护进程线程离开并且线程没有完成其工作之前退出。 主程序 第一个线程只写5000个第一个整数,而第二个线程不写任何数字

    • 现在我需要实现作业队列,因为有些作业不能并行启动。问题是某些作业的状态()是从客户机传递的,为了排队的目的,应该保持这些状态。另一方面,我不能根据用户请求调度作业,因为我不知道什么时候应该执行它!(应该在上一个作业之后立即执行)

    • 我有一项服务,每天在Kubernetes上部署数千个短期工作。我试图让Kubernetes在完成后使用这里描述的功能删除这些作业: https://kubernetes.io/docs/concepts/workloads/controllers/jobs-run-to-completion/#clean-up-finished-jobs-automatically 作业完成,但在表示的时间限制之

    • 问题内容: 这是一个代码片段。 这个定义好吗?也就是说,可以代替吗? 因为我记得C ‘98中的等效程序(如果使用 )具有未定义的行为。用VS编译器和G 编译时,程序的输出是不同的。 问题答案: 正如我在评论中提到的,该测试用例可以简化为: 那么问题就变成了,或者是? 让我们看一下相关的2.x文档和3.x文档: Python从左到右计算表达式。请注意,在评估分配时,右侧的评估先于左侧。 在以下各行中