任务步
块导向处理并不是唯一处理方式步.如果步必须包含存储过程调用吗?你可以
将调用实现为物品阅读器过程结束后返回 null。
不过,这样做有点不自然,因为需要一个无作作物品写手.
春季批次提供了任务步针对这个场景。
这任务接口有一种方法,执行,称为
反复由任务步直到它再次出现重复状态。已结束或者投掷
作为例外,表示失败。每次呼叫任务被包裹在交易中。任务实现者可能会调用存储过程、脚本或SQL更新
陈述。
-
Java
-
XML
要创建一个任务步在爪哇,豆子传给了任务小建造方法
应实现任务接口。没有呼唤块应当
架构任务步.以下示例展示了一个简单的任务:
@Bean
public Step step1(JobRepository jobRepository, PlatformTransactionManager transactionManager) {
return new StepBuilder("step1", jobRepository)
.tasklet(myTasklet(), transactionManager)
.build();
}
要创建一个任务步在XML中,裁判属性<任务/>元素应当
引用定义任务对象。不<块/块/>应该使用 元素
在<任务/>.以下示例展示了一个简单的任务:
<step id="step1">
<tasklet ref="myTasklet"/>
</step>
如果它实现了StepListener(听音器)接口任务步自动将任务组注册为StepListener(听音器). |
任务适配器
与其他适配器一样,物品阅读器和物品写手接口,以及任务接口包含一个实现,允许对任何已有的进行调整
类:任务适配器.一个可能有用的例子是现有的DAO,即
用于更新一组记录上的标志。你可以使用任务适配器给它打电话
无需为任务接口。
-
Java
-
XML
以下示例展示了如何定义任务适配器在爪哇语中:
@Bean
public MethodInvokingTaskletAdapter myTasklet() {
MethodInvokingTaskletAdapter adapter = new MethodInvokingTaskletAdapter();
adapter.setTargetObject(fooDao());
adapter.setTargetMethod("updateFoo");
return adapter;
}
以下示例展示了如何定义任务适配器以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》
批样本项目)是一个项目任务承担此类责任的实施:
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");
}
}
前述任务小实现会删除给定目录内的所有文件。它
需要注意的是执行方法只调用一次。剩下的就是
参考文献任务小来自步.
-
Java
-
XML
以下示例展示了如何引用任务小来自步在爪哇语中:
@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形式表示:
<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>