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

Spring批处理作业调度程序运行几次后停止执行

鞠嘉誉
2023-03-14

在一个项目中,我们必须运行一个定期开始的作业(现在QA env上每5分钟开始一次),该作业处理40K用户的一些任务。我们决定使用Spring Batch,因为它非常适合,并且几乎用默认配置实现了它(例如,它使用SynctaskExecutor)。好的,有一个工作由一个步骤组成:

  1. 开箱即用HibernatePagingItemReader
  2. 在内存中执行轻量级计算的自定义ItemProcessor
  3. 自定义ItemWriter,它通过多个JPQL和本机查询将数据保存到同一个PostgreSQL db。

作业本身是用@enablescheduling调度的,并且每5分钟由cron表达式触发一次:

@Scheduled(cron = "${job.assignment-rules}")
void processAssignments() {
  try {
    log.debug("Running assignment processing job");
    jobLauncher.run(assignmentProcessingJob, populateJobParameters());
  } catch (JobExecutionException e) {
    log.error("Job processing has failed", e);
  }
}
job:
  assignment-rules: "0 0/5  * * * *"
select ex.job_instance_id, ex.create_time, ex.start_time, ex.end_time, ex.status, ex.exit_code, ex.exit_message
from batch_job_execution ex inner join batch_job_instance bji on ex.job_instance_id = bji.job_instance_id
order by start_time desc, job_instance_id desc;

job:
  invitation-email: "0 0/10 * * * *"
  assignment-rules: "0 0/5  * * * *"
  rm-subordinates-count: "0 0/30 * * * *"

提前多谢

共有1个答案

虞华彩
2023-03-14

在您的用例中,使用默认的SynctaskExecutor来启动作业是不安全的,因为所有作业都将由一个线程执行。如果其中一个作业运行时间超过5分钟,则下一个作业将堆积如山,并在某个时刻无法启动。

我将在您的用例中用异步TaskExecutor实现(如org.springframework.scheduleing.concurrent.ThreadPoolTaskExecutor)配置JobLauncher。您可以在Configuring a JobLauncher一节中找到一个示例(请参见“图3.异步作业启动器序列”)。

除了配置为由Spring Batch的JobLauncher使用的任务执行器之外,还需要确保Spring Boot使用了正确的任务执行器来调度任务(因为您使用的是@enableScheduling)。有关更多细节,请参阅任务执行和调度部分。

 类似资料:
  • 我在版本2.1.4中开始学习Spring Boot Batch 这是我的配置 最后一节课是我的排定程序:

  • 我正在尝试在后台运行作业,允许我根据某种条件或在超时发生后停止它。 我有这两块代码:

  • Spring批处理作业与flatfileitemreader(从csv读取)、processor(更新adwords api提要详细信息,对于csv文件中的每个记录(大约有40条记录),这一步大约需要40秒)和正在更新DB中记录的定制writer一起使用。 web.xml

  • 我正在尝试自动登录到2008 R2服务器上的一组RDP客户端,当从桌面双击批处理文件时,下面的批处理工作正常,但是当将.bat文件设置为作为任务调度程序中的任务运行时,什么都没有发生 计划任务被设置为在管理员帐户下运行(只有一个可用),并且(开始于)可选字段也被设置为“C:\Users\Administrator\Desktop”。

  • 我需要根据参数中提供的数字(n)执行特定的spring boot应用程序n次。我正在使用spring boot,并考虑使用spring调度程序来实现这一点。spring scheduler可以用来调度一个任务4-5次,然后停止吗? 我需要有一个单独的日志文件,为每个实例生成的输出文件。