任务步

块导向处理并不是唯一处理方式.如果必须包含存储过程调用吗?你可以 将调用实现为物品阅读器过程结束后返回 null。 不过,这样做有点不自然,因为需要一个无作作物品写手. 春季批次提供了任务步针对这个场景。spring-doc.cadn.net.cn

任务接口有一种方法,执行,称为 反复由任务步直到它再次出现重复状态。已结束或者投掷 作为例外,表示失败。每次呼叫任务被包裹在交易中。任务实现者可能会调用存储过程、脚本或SQL更新 陈述。spring-doc.cadn.net.cn

要创建一个任务步在爪哇,豆子传给了任务小建造方法 应实现任务接口。没有呼唤应当 架构任务步.以下示例展示了一个简单的任务:spring-doc.cadn.net.cn

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

要创建一个任务步在XML中,裁判属性<任务/>元素应当 引用定义任务对象。不<块/块/>应该使用 元素 在<任务/>.以下示例展示了一个简单的任务:spring-doc.cadn.net.cn

<step id="step1">
    <tasklet ref="myTasklet"/>
</step>
如果它实现了StepListener(听音器)接口任务步自动将任务组注册为StepListener(听音器).

任务适配器

与其他适配器一样,物品阅读器物品写手接口,以及任务接口包含一个实现,允许对任何已有的进行调整 类:任务适配器.一个可能有用的例子是现有的DAO,即 用于更新一组记录上的标志。你可以使用任务适配器给它打电话 无需为任务接口。spring-doc.cadn.net.cn

以下示例展示了如何定义任务适配器在爪哇语中:spring-doc.cadn.net.cn

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

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

	return adapter;
}

以下示例展示了如何定义任务适配器以XML形式表示:spring-doc.cadn.net.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>

示例任务实现

许多批处理作业包含必须在主要处理开始前完成的步骤, 建立各种资源,或在处理完成后进行清理 资源。对于大量处理文件的工作,通常需要 在某些文件成功上传到另一个文件后,本地删除它们 位置。以下示例(摘自《Spring》 批样本项目)是一个项目任务承担此类责任的实施:spring-doc.cadn.net.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");
    }
}

前述任务小实现会删除给定目录内的所有文件。它 需要注意的是执行方法只调用一次。剩下的就是 参考文献任务小来自.spring-doc.cadn.net.cn

以下示例展示了如何引用任务小来自在爪哇语中:spring-doc.cadn.net.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形式表示:spring-doc.cadn.net.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>