TaskletStep

面向数据块的处理并不是在 .如果 Must 包含存储过程调用,该怎么办?你可以 将调用实现为 AN 并在过程完成后返回 null。 但是,这样做有点不自然,因为需要有一个 no-op 。 Spring Batch 为这种情况提供了。StepStepItemReaderItemWriterTaskletStepspring-doc.cn

该接口有一个方法,称为 重复 until 它返回或引发 表示失败的异常。对 a 的每次调用都包装在一个事务中。 实现者可能会调用存储过程、脚本或 SQL 更新 陈述。TaskletexecuteTaskletStepRepeatStatus.FINISHEDTaskletTaskletspring-doc.cn

要在 Java 中创建一个,请将 bean 传递给构建器 应该实现接口。在以下情况下不应调用 构建一个 .下面的示例展示了一个简单的 tasklet:TaskletSteptaskletTaskletchunkTaskletStepspring-doc.cn

@Bean
public Step step1(JobRepository jobRepository, PlatformTransactionManager transactionManager) {
    return new StepBuilder("step1", jobRepository)
    			.tasklet(myTasklet(), transactionManager)
    			.build();
}

要在 XML 中创建 API,元素的属性应 引用定义对象的 Bean。不应使用任何元素 在 .下面的示例展示了一个简单的 tasklet:TaskletStepref<tasklet/>Tasklet<chunk/><tasklet/>spring-doc.cn

<step id="step1">
    <tasklet ref="myTasklet"/>
</step>
如果它实现了接口,则自动将微线程注册为 .StepListenerTaskletStepStepListener

TaskletAdapter

与 and 接口的其他适配器一样,该接口包含一个实现,该实现允许自身适应任何预先存在的 类:。这可能有用的一个示例是现有的 DAO,它是 用于更新一组记录上的标志。您可以使用 to 调用此 类,而不必为接口编写适配器。ItemReaderItemWriterTaskletTaskletAdapterTaskletAdapterTaskletspring-doc.cn

以下示例演示如何在 Java 中定义 a:TaskletAdapterspring-doc.cn

Java 配置
@Bean
public MethodInvokingTaskletAdapter myTasklet() {
	MethodInvokingTaskletAdapter adapter = new MethodInvokingTaskletAdapter();

	adapter.setTargetObject(fooDao());
	adapter.setTargetMethod("updateFoo");

	return adapter;
}

下面的示例演示如何在 XML 中定义 a:TaskletAdapterspring-doc.cn

XML 配置
<bean id="myTasklet" class="o.s.b.core.step.tasklet.MethodInvokingTaskletAdapter">
    <property name="targetObject">
        <bean class="org.mycompany.FooDao"/>
    </property>
    <property name="targetMethod" value="updateFoo" />
</bean>

示例实现Tasklet

许多批处理作业包含在主处理开始之前必须完成的步骤。 设置各种资源,或者在处理完成后清理这些资源 资源。对于大量处理文件的工作,通常需要 在将某些文件成功上传到另一个文件后,在本地删除这些文件 位置。以下示例(摘自 Spring Batch samples 项目)是具有此类责任的实现:Taskletspring-doc.cn

public class FileDeletingTasklet implements Tasklet, InitializingBean {

    private Resource directory;

    public RepeatStatus execute(StepContribution contribution,
                                ChunkContext chunkContext) throws Exception {
        File dir = directory.getFile();
        Assert.state(dir.isDirectory(), "The resource must be a directory");

        File[] files = dir.listFiles();
        for (int i = 0; i < files.length; i++) {
            boolean deleted = files[i].delete();
            if (!deleted) {
                throw new UnexpectedJobExecutionException("Could not delete file " +
                                                          files[i].getPath());
            }
        }
        return RepeatStatus.FINISHED;
    }

    public void setDirectoryResource(Resource directory) {
        this.directory = directory;
    }

    public void afterPropertiesSet() throws Exception {
        Assert.state(directory != null, "Directory must be set");
    }
}

前面的实现删除给定目录中的所有文件。它 需要注意的是,该方法只调用一次。剩下的就是 引用 来自 .taskletexecutetaskletstepspring-doc.cn

下面的示例展示了如何在 Java 中引用 the from the :taskletstepspring-doc.cn

Java 配置
@Bean
public Job taskletJob(JobRepository jobRepository, Step deleteFilesInDir) {
	return new JobBuilder("taskletJob", jobRepository)
				.start(deleteFilesInDir)
				.build();
}

@Bean
public Step deleteFilesInDir(JobRepository jobRepository, PlatformTransactionManager transactionManager) {
	return new StepBuilder("deleteFilesInDir", jobRepository)
				.tasklet(fileDeletingTasklet(), transactionManager)
				.build();
}

@Bean
public FileDeletingTasklet fileDeletingTasklet() {
	FileDeletingTasklet tasklet = new FileDeletingTasklet();

	tasklet.setDirectoryResource(new FileSystemResource("target/test-outputs/test-dir"));

	return tasklet;
}

以下示例演示如何在 XML 中引用 from the :taskletstepspring-doc.cn

XML 配置
<job id="taskletJob">
    <step id="deleteFilesInDir">
       <tasklet ref="fileDeletingTasklet"/>
    </step>
</job>

<beans:bean id="fileDeletingTasklet"
            class="org.springframework.batch.samples.tasklet.FileDeletingTasklet">
    <beans:property name="directoryResource">
        <beans:bean id="directory"
                    class="org.springframework.core.io.FileSystemResource">
            <beans:constructor-arg value="target/test-outputs/test-dir" />
        </beans:bean>
    </beans:property>
</beans:bean>