解决Spring Batch框架job任务只跑一次的问题

作者:20190115 时间:2023-01-07 00:13:53 

Spring Batch job任务只跑一次

在一次实际使用spring batch的过程中,在定时任务中,第一次执行Job没有出现问题,然后再次执行时不会执行job任务;

出现原因

针对这种异常需要明确Job Instance的概念,Job Instance 是由Job的名称和执行该job的参数组成的,当执行Job时,会由于参数相同,会认为是同一个Job实例,如果该Job已经执行过,就会报出异常。判断Job是否执行过的状态是保存到Job Repository中的。

解决方法

为了使执行参数不同,可以在参数中添加一个时间戳


JobParametersBuilder builder = new JobParametersBuilder();      
                      builder.addDate("date", new Date());

job的启动,停止,放弃

1、启动一个job

运行一个批处理任务至少有两点要求:一个 JobLauncher 和一个用来运行的 job 。它们都包含了相同或是不同的 context 。举例来说,从命令行来启动job,会为每一个job初始化一个JVM,因此每个job会有一个自己的 JobLauncher;从web容器的HttpRequest来启动job,一般只是用一个 JobLauncher 来异步启动job,http请求会调用这个 JobLauncher 来启动它们需要的job。

通过web启动job的例子:


@Controller
public class JobLauncherController {
   @Autowired
   JobLauncher jobLauncher;
   @Autowired
   Job job;
   @RequestMapping("/jobLauncher.html")
   public void handle() throws Exception{
     jobLauncher.run(job, new JobParameters());
   }
}

2、停止一个job

关闭不是立即发生的,因为没有办法将一个任务立刻强制停掉,尤其是当任务进行到开发人员自己的代码段时,框架在此刻是无能为力的,比如某个业务逻辑处理。而一旦控制权还给了框架,它会立刻设置当前 StepExecution 为 BachStatus.STOPPED ,意为停止,然后保存,最后在完成前对JobExecution进行相同的操作。


Set<Long> executions = jobOperator.getRunningExecutions("sampleJob");
jobOperator.stop(executions.iterator().next());

或者在配置文件中实现:

它能够让job进行短暂的停留,以便操作员有时间进行其他的操作,stop元素必须配置restart属性,当该job重新启动的时候,需要手动触发,执行step2。


<step id="step1" parent="s1">
   <stop on="COMPLETED" restart="step2"/>
</step>
<step id="step2" parent="s2"/>

3、放弃一个job

一个job的执行过程当执行到FAILED状态之后,如果它是可重启的,它将会被重启。如果任务的执行过程状态是ABANDONED,那么框架就不会重启它。ABANDONED状态也适用于执行步骤,使得它们可以被跳过,即便是在一个可重启的任务执行之中:如果任务执行过程中碰到在上一次执行失败后标记为ABANDONED的步骤,将会跳过该步骤直接到下一步(这是由任务流定义和执行步骤的退出码决定的)。

如果当前的系统进程死掉了(“kill -9”或系统错误),job自然也不会运行,但JobRepository是无法侦测到这个错误的,因为进程死掉之前没有对它进行任何通知。你必须手动的告诉它,你知道任务已经失败了还是说考虑放弃这个任务(设置它的状态为FAILED或ABANDONED)-这是业务逻辑层的事情,无法做到自动决策。

只有在不可重启的任务中才需要设置为FAILED状态,或者你知道重启后数据还是有效的。Spring Batch Admin中有一系列工具JobService,用以取消正在进行执行的任务。

4、失败一个job

失败的job是可以重新启动的,因为它的状态是FAILED,如果step2失败,则返回一个EARLY TERMINATION的返回码,step3也就不会执行。否则继续执行step3


<step id="step1" parent="s1" next="step2">
<step id="step2" parent="s2">
   <fail on="FAILED" exit-code="EARLY TERMINATION"/>
   <next on="*" to="step3"/>
</step>
<step id="step3" parent="s3">

5、结束一个job

已经结束的job是不能重新启动的,因为它的状态是COMPLETED。如果step2失败了,则step3就不执行了,该job也就COMPLETED,结束了。如果step2成功了,则继续往下执行step3。


<step id="step1" parent="s1" next="step2">
<step id="step2" parent="s2">
   <end on="FAILED"/>
   <next on="*" to="step3"/>
</step>
<step id="step3" parent="s3">

来源:https://blog.csdn.net/lylzdd/article/details/89157917

标签:Spring,Batch,job任务
0
投稿

猜你喜欢

  • Java中方法的重写与成员变量的隐藏

    2023-06-01 01:35:55
  • spring @Profiles和@PropertySource实现根据环境切换配置文件

    2023-09-18 21:28:43
  • Android使用SoundPool播放短音效

    2022-03-02 12:33:00
  • DevExpress设置饼状图的Lable位置实例

    2022-02-02 15:53:37
  • 使用Feign动态设置header和原理分析

    2021-07-11 10:30:46
  • java自定义注解实现前后台参数校验的实例

    2023-04-27 23:53:21
  • Spring MVC基于注解的使用之JSON数据处理的方法

    2022-06-02 14:02:43
  • Java Web开发过程中登陆模块的验证码的实现方式总结

    2022-01-29 19:33:16
  • c#中list.FindAll与for循环的性能对比总结

    2021-08-15 21:20:44
  • android实现来电静音示例(监听来电)

    2021-09-23 09:43:48
  • Kotlin协程启动createCoroutine及创建startCoroutine原理

    2023-01-04 03:05:31
  • java的Jackson将json字符串转换成泛型List

    2021-10-06 20:17:49
  • C#获取网页源代码的方法

    2023-06-19 05:43:44
  • Flutter实现微信朋友圈功能

    2022-10-02 00:28:15
  • 浅谈c++性能测试工具之计算时间复杂度

    2023-07-09 12:40:05
  • Mybatis注解实现多数据源读写分离详解

    2021-12-15 21:44:16
  • Java 高并发十: JDK8对并发的新支持详解

    2022-12-02 02:43:09
  • Android clipChildren属性实例详解

    2022-12-29 02:35:50
  • Android zygote启动流程详解

    2023-09-13 07:44:12
  • Android App中使用Gallery制作幻灯片播放效果

    2022-04-03 21:53:37
  • asp之家 软件编程 m.aspxhome.com