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

Spring批处理-从第一步重新运行

东方乐
2023-03-14

有人知道有没有办法在Spring重新开始吗?我希望它首先从第一步开始,然后是第二步,第三步,然后回到第一步,第二步,第三步,等等,直到满足条件。我试着用谷歌搜索,但没有找到任何具体的例子。

迄今为止的代码:

@Bean
Job job(JobBuilderFactory factory) {
    return factory.get(JOB_NAME)
            .start(stagingStep)
            .next(analyzeStep)
            .next(reportingStep)

            .preventRestart()
            .build();
}

共有1个答案

鱼旺
2023-03-14

我认为这可以通过多种方式来完成...

1.拦截此处提到的作业

<job id="footballJob">
<step id="playerload"          parent="s1" next="gameLoad"/>
<step id="gameLoad"            parent="s2" next="playerSummarization"/>
<step id="playerSummarization" parent="s3"/>
<listeners>
    <listener ref="sampleListener"/>
</listeners>

实现你的列表器。。

public interface JobExecutionListener {

void beforeJob(JobExecution jobExecution);

void afterJob(JobExecution jobExecution); // implement and call the job again
}

2.实现自己的触发器/调度程序。。。

<bean id="runScheduler" class="com.spring.scheduler.MyScheduler" >
    <property name="jobLauncher" ref="jobLauncher" />
    <property name="job" ref="helloWorldJob" />
</bean>

...

<task:scheduled-tasks>
<!--task:scheduled ref="runScheduler" method="run" fixed-delay="5000" /> -->

<task:scheduled ref="runScheduler" method="run"  cron="*/5 * * * * *" />
</task:scheduled-tasks>

您可以使用自己的触发器并将引用传递到上面。。。

<bean id="mytrigger" class="com.spring.scheduler.MyTrigger" />

public class MyScheduler {

@Autowired
private JobLauncher jobLauncher;

@Autowired
private Job job;

public void run() {
    try {
        JobParameters param = new JobParametersBuilder().toJobParameters();
        String dateParam = new Date().toString();
        JobExecution execution = jobLauncher.run(job, param);
        System.out.println("Exit Status in scheduler: " + execution.getStatus());

    } catch (Exception e) {
        e.printStackTrace();
    }
}

然后,如果需要,你可以创建一个触发器

public class MyTrigger implements Trigger{
@Override
public Date nextExecutionTime(TriggerContext triggerContext) {...return date;}

3.如果只有一个tasklet需要再次运行,那么返回RepeatStatus就很简单了。可继续,此任务将反复运行。。。

public RepeatStatus execute(StepContribution contribution,
ChunkContext chunkContext)throws Exception 
{
   return RepeatStatus.CONTINUABLE;//RepeatStatus.FINISHED;
}

如果你想要一些特定的步骤也可以完成(操作步骤1或2,并使用特定步骤构建作业..再次运行之前)

 类似资料:
  • 我们的Spring Batch应用程序在重新启动失败的作业时,再次处理相同的记录,导致重复的行,我们希望了解如何避免这种情况。 启动批处理作业的Spring集成轮询器配置为每两个小时运行一次。第二次运行时,作业参数将相同,但如果上一次运行失败(例如,由于数据截断异常),Spring Batch不会抱怨作业已完成。 在故障点,几十万条记录已经被处理并从源表复制到目标表。在以后运行作业时,相同的行将复

  • 我正在做一个包括Spring批处理的项目,在复制代码片段之前,我要简单地总结一下这项工作是如何使用cron的。 cron在我的项目上调用restapi(@PostMapping(“/jobs/external/{jobName}”) 在post方法中,我获取作业并执行它 在每次执行中,我都应该执行一个步骤 该步骤包含一个读卡器(对弹性API的外部rest调用以获取文档)和一个处理器 现在我的问题是

  • 我试图配置我的第一个多线程作业。我们有大约200,000条记录的主目录,我们需要处理。我想将文件分解为10个文件并处理它们。拆分文件tasklet工作正常 主步骤在我的配置中运行,但从步骤不运行。下面是我的配置。 分割者: MultiResourceItemReader: FlatFileItemWriter: 作业配置: 从属步骤配置: 请告知我做错了什么。我没有看到处理器urlFileItem

  • 我有一个spring批处理作业,预计将根据FIFO顺序处理'N'个作业ID。这个Spring批处理作业有5个步骤。 我们使用DECIDER来确定是否有更多的job-id。如果是,请转到第一步并运行该job-id的所有步骤。 我在spring-batch发出的日志中看到“duplicate step”消息,在第一个作业中的步骤(例如job-id=1)获得未知状态之前,该消息似乎没有问题。在这种情况下

  • 我有一个spring批处理工作,比如说5个步骤(

  • 我有一个spring批处理作业,从CSV文件读取并写入数据库。我想让它重新启动。例如,如果在读取文件或写入db时出现异常,导致作业失败,则应从失败的同一点/块重新开始,而不是从头开始读取整个文件。 我正在从一个endpoint触发作业启动器,并在我的控制器中配置了它。 目前,我正在通过控制器将参数(这是一个唯一的标识符/数字)传递给作业参数,以运行新的作业实例。如果作业失败,我将使用与GET请求中