TaskletStep
面向块的处理并不是在Step.如果一个Step必须包含存储过程调用?你可以
将调用实现为ItemReader并在过程完成后返回 null。
然而,这样做有点不自然,因为需要有一个无作ItemWriter.
Spring Batch 提供了TaskletStep对于这种情况。
这Taskletinterface 有一个方法,execute,称为
重复由TaskletStep直到它返回RepeatStatus.FINISHED或投掷
异常以表示失败。每次调用Tasklet被包装在事务中。Tasklet实现者可能会调用存储过程、脚本或 SQL 更新
陈述。
- 
Java 
- 
XML 
要创建TaskletStep在 Java 中,bean 传递给tasklet建造者的方法
应实现Tasklet接口。没有电话chunk当
构建一个TaskletStep.以下示例显示了一个简单的任务:
@Bean
public Step step1(JobRepository jobRepository, PlatformTransactionManager transactionManager) {
    return new StepBuilder("step1", jobRepository)
    			.tasklet(myTasklet(), transactionManager)
    			.build();
}要创建TaskletStep在 XML 中,ref属性的<tasklet/>元素应该
引用定义Tasklet对象。不<chunk/>元素应该使用
在<tasklet/>.以下示例显示了一个简单的任务:
<step id="step1">
    <tasklet ref="myTasklet"/>
</step>| 如果它实现了 StepListener接口TaskletStep自动将 tasklet 注册为StepListener. | 
TaskletAdapter
与其他适配器一样,用于ItemReader和ItemWriter接口,则Tasklet接口包含一个允许自行适应任何预先存在的实现
类:TaskletAdapter.这可能有用的一个例子是现有的 DAO,它是
用于更新一组记录上的标志。您可以使用TaskletAdapter称呼此
类,而无需为Tasklet接口。
- 
Java 
- 
XML 
以下示例显示如何定义TaskletAdapter在 Java 中:
@Bean
public MethodInvokingTaskletAdapter myTasklet() {
	MethodInvokingTaskletAdapter adapter = new MethodInvokingTaskletAdapter();
	adapter.setTargetObject(fooDao());
	adapter.setTargetMethod("updateFoo");
	return adapter;
}以下示例显示如何定义TaskletAdapter在 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 项目)是一个Tasklet实施时承担这样的责任:
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");
    }
}前面的tasklet实现删除给定目录中的所有文件。它
应该注意的是,execute方法仅调用一次。剩下的就是
引用tasklet从step.
- 
Java 
- 
XML 
以下示例演示如何引用tasklet从step在 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;
}以下示例演示如何引用tasklet从step在 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>