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

Spring批处理-如何执行清除任务

顾昌翰
2023-03-14

我编写了一个简单的spring批处理tasklet,它调用一个dao方法,该方法反过来执行一些删除操作。但我不确定该怎么称呼这份工作。

public class RemoveSpringBatchHistoryTasklet implements Tasklet {

    @Autowired
    private SpringBatchDao springBatchDao;

    public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext)
            throws Exception {
        contribution.incrementWriteCount(springBatchDao.purge());
        return RepeatStatus.FINISHED;
    }

}

到目前为止,为了执行我的spring批处理作业,我使用了类似于这样的设置的quartz触发器。每个作业都有自己的xml文件,该文件具有读写器。

    <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
        <property name="jobDetails">
           <list>
              <ref bean="dailyTranCountJobDetail" />
           </list>
        </property>
        <property name="triggers">
           <list>
              <ref bean="dailyTranCountCronTrigger" />
           </list>
        </property>
    </bean>

    <bean id="dailyTranCountCronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
        <property name="jobDetail" ref="dailyTranCountJobDetail" />
        <property name="cronExpression" value="#{batchProps['cron.dailyTranCounts']}" />
    </bean>

    <bean id="dailyTranCountJobDetail" class="org.springframework.scheduling.quartz.JobDetailBean">
        <property name="jobClass" value="com.myer.reporting.batch.JobLauncherDetails" />
        <property name="group" value="quartz-batch" />
        <property name="jobDataAsMap">
            <map>
                <entry key="jobName" value="job-daily-tran-counts" />
                <entry key="jobLocator" value-ref="jobRegistry" />
                <entry key="jobLauncher" value-ref="jobLauncher" />
            </map>
        </property>
    </bean>

然后这里是一个作业文件本身的示例,包含一个读写器。

<job id="job-daily-tran-counts" xmlns="http://www.springframework.org/schema/batch">
    <step id="job-daily-tran-counts-step1">
        <tasklet transaction-manager="custDbTransactionManager">
            <chunk 
                reader="dailyTranCountJdbcCursorItemReader" 
                writer="dailyTranCountItemWriter" 
                commit-interval="1000" />
        </tasklet>
    </step>
</job>

<bean id="dailyTranCountJdbcCursorItemReader"
    class="com.myer.reporting.dao.itemreader.DailyTranCountJdbcCursorItemReader"
    scope="step"
    parent="abstractEposJdbcDao">
    <property name="rowMapper">
        <bean class="com.myer.reporting.dao.mapper.DailyTranCountMapper" />
    </property>
</bean>

<bean id="dailyTranCountItemWriter" 
    class="com.myer.reporting.dao.itemwriter.DailyTranCountItemWriter" 
    parent="abstractCustDbJdbcDao"/>

显然,这份新工作没有读者或作家。那么,我执行新任务的最佳/正确方式是什么?

谢谢

共有1个答案

苏高远
2023-03-14

我更喜欢java配置而不是xml。您可以使用以下代码配置您的tasklet:

@Configuration
@EnableBatchProcessing
public class BatchCleanUpJobsConfiguration {

  @Bean
  public Job batchCleanUpJob(final JobBuilderFactory jobBuilderFactory,
                             final StepBuilderFactory stepBuilderFactory,
                             final RemoveSpringBatchHistoryTasklet removeSpringBatchHistoryTasklet) {
    return jobBuilderFactory.get("batchCleanUpJob")
        .start(stepBuilderFactory.get("batchCleanUpStep")
                   .tasklet(removeSpringBatchHistoryTasklet)
                   .build())
        .build();
  }

  @Bean
  public RemoveSpringBatchHistoryTasklet batchCleanUpTasklet(final JdbcTemplate jdbcTemplate) {
    final var tasklet = new RemoveSpringBatchHistoryTasklet();
    tasklet.setJdbcTemplate(jdbcTemplate);
    return tasklet;
  }
}

要计划新作业,请使用以下代码:

@Component
@RequiredArgsConstructor
public class BatchCleanUpJobsScheduler {

  private final Job batchCleanUpJob;
  private final JobLauncher launcher;

  @Scheduled(cron = "0 0 0 * * MON-FRI")
  public void launchBatchCleanupJob()
      throws JobParametersInvalidException, JobExecutionAlreadyRunningException,
          JobRestartException, JobInstanceAlreadyCompleteException {
    launcher.run(
        batchCleanUpJob,
        new JobParametersBuilder()
            .addLong("launchTime", System.currentTimeMillis())
            .toJobParameters());
  }
}
 类似资料:
  • 您好,我是Spring batch的新手,我遇到了以下无法解决的异常: 此处为我的代码: 我可以通过添加

  • 我正在尝试修复Spring Batch中的一个问题,这个问题最近一直困扰着我们的系统。我们有一份工作,在大多数情况下都很好。下载和处理数据是一个多步骤的工作。 问题是有时工作会爆棚。也许我们试图连接到的服务器抛出了错误,或者我们在工作进行到一半时关闭了服务器。此时,下次我们的quartz调度程序尝试运行该作业时,它似乎什么也不做。以下是此作业定义的删节版本: 委婉地说,我是Spring Batch

  • 我正在使用STS 2.81附带的Spring Batch模板和Manning的Spring Batch in Action中的示例创建一个Spring Batch作业。我可以毫无问题地执行块读取器和写入器,但我的代码跳过了处理器。我甚至尝试过在处理器中取消所有对象,但什么也没有,对象仍然设法被写入,就像处理器被忽略一样。我尝试在处理器中调用system.out.println,但没有在终端中打印出

  • 我们目前正在将一个复杂的spring boot batch+admin UI系统迁移到一个spring-cloud-task基础设施中,该基础设施将被管理云数据流。 作为POC的第一阶段,我们必须能够将所有Spring批处理作业打包在同一个部署JAR下,并且能够使用自定义作业参数一个接一个地运行它们,并且支持某种REST API远程执行作业/任务。 我们删除了所有spring-batch管理依赖项