|
对于最新稳定版本,请使用Spring Batch Documentation 6.0.0! |
晚期绑定工作和步属性
之前展示的XML和平面文件示例均使用Spring资源抽象化 获取文件。这样做是因为资源有getFile返回java.io.file. 你可以用标准 Spring 配置 XML 和平面文件资源 构建:
-
Java
-
XML
以下示例展示了 Java 中的晚绑定:
@Bean
public FlatFileItemReader flatFileItemReader() {
FlatFileItemReader<Foo> reader = new FlatFileItemReaderBuilder<Foo>()
.name("flatFileItemReader")
.resource(new FileSystemResource("file://outputs/file.txt"))
...
}
以下示例展示了XML中的晚绑定:
<bean id="flatFileItemReader"
class="org.springframework.batch.item.file.FlatFileItemReader">
<property name="resource"
value="file://outputs/file.txt" />
</bean>
前述资源从指定的文件系统位置加载文件。 注意 绝对位置必须以双斜杠()开头。在大多数 Spring应用中,这种解决方案足够好,因为这些资源的名称在编译时已知。然而,在批处理场景中,文件名可能需要在运行时确定为作业的参数。这可以通过以下方式解决//-D参数 读取系统属性。
-
Java
-
XML
以下是如何从Java属性中读取文件名的方法:
@Bean
public FlatFileItemReader flatFileItemReader(@Value("${input.file.name}") String name) {
return new FlatFileItemReaderBuilder<Foo>()
.name("flatFileItemReader")
.resource(new FileSystemResource(name))
...
}
以下示例展示了如何从属性中读取文件名的XML格式:
<bean id="flatFileItemReader"
class="org.springframework.batch.item.file.FlatFileItemReader">
<property name="resource" value="${input.file.name}" />
</bean>
该解决方案所需的只需一个系统参数(例如-Dinput.file.name=“file://outputs/file.txt”).
虽然你可以使用PropertyPlaceholderConfigurer这里,如果系统性质总是被设定,则不一定是必要的,因为资源编辑器在春季已经对系统属性进行过滤和占位替换。 |
通常,在批处理情况下,最好在作业参数作业的(而非通过系统属性)并访问它们
道路。为此,Spring Batch允许对多种文件进行晚期装订工作和步属性。
-
Java
-
XML
以下示例展示了如何在 Java 中参数化文件名:
@StepScope
@Bean
public FlatFileItemReader flatFileItemReader(@Value("#{jobParameters['input.file.name']}") String name) {
return new FlatFileItemReaderBuilder<Foo>()
.name("flatFileItemReader")
.resource(new FileSystemResource(name))
...
}
以下示例展示了如何在XML中参数化文件名:
<bean id="flatFileItemReader" scope="step"
class="org.springframework.batch.item.file.FlatFileItemReader">
<property name="resource" value="#{jobParameters['input.file.name']}" />
</bean>
你可以同时访问作业执行和步执行水平执行上下文在
同样的。
-
Java
-
XML
以下示例展示了如何访问执行上下文在爪哇语中:
@StepScope
@Bean
public FlatFileItemReader flatFileItemReader(@Value("#{jobExecutionContext['input.file.name']}") String name) {
return new FlatFileItemReaderBuilder<Foo>()
.name("flatFileItemReader")
.resource(new FileSystemResource(name))
...
}
@StepScope
@Bean
public FlatFileItemReader flatFileItemReader(@Value("#{stepExecutionContext['input.file.name']}") String name) {
return new FlatFileItemReaderBuilder<Foo>()
.name("flatFileItemReader")
.resource(new FileSystemResource(name))
...
}
以下示例展示了如何访问执行上下文以XML形式表示:
<bean id="flatFileItemReader" scope="step"
class="org.springframework.batch.item.file.FlatFileItemReader">
<property name="resource" value="#{jobExecutionContext['input.file.name']}" />
</bean>
<bean id="flatFileItemReader" scope="step"
class="org.springframework.batch.item.file.FlatFileItemReader">
<property name="resource" value="#{stepExecutionContext['input.file.name']}" />
</bean>
任何使用晚期结合的豆子都必须声明为scope=“step”.更多信息请参见步阶示波器。
一个步豆子不应该被阶级范围或工作范围限制。如果步骤需要晚期绑定
然后是该步骤的组成部分(任务项、项目读取/写入、完成策略等)
才是应该被内窥镜检查的。 |
| 如果你使用 Spring 3.0(或更高版本),步进范围的 beans 中的表达式在 Spring表达式语言,一种强大的通用语言,具有许多有趣的内容 特征。为了提供向后兼容性,如果 Spring Batch 检测到 Spring的旧版本,它使用一种功能较弱的本地表达式语言,且 它的解析规则略有不同。主要区别是地图按键 上述例子不必在春季2.5时引用,但引用是必须的 在春季3.0中。 |
阶梯范围
之前展示的所有晚期绑定示例的范围为步在
豆子的定义。
-
Java
-
XML
以下示例展示了 Java 中绑定到 step 作用域的示例:
@StepScope
@Bean
public FlatFileItemReader flatFileItemReader(@Value("#{jobParameters[input.file.name]}") String name) {
return new FlatFileItemReaderBuilder<Foo>()
.name("flatFileItemReader")
.resource(new FileSystemResource(name))
...
}
以下示例展示了 XML 中绑定步域的示例:
<bean id="flatFileItemReader" scope="step"
class="org.springframework.batch.item.file.FlatFileItemReader">
<property name="resource" value="#{jobParameters[input.file.name]}" />
</bean>
使用一个步必须使用晚期结合,因为豆子不能
实际上被实例化直到步开始,以便找到属性。
由于默认情况下它不属于 Spring 容器,必须添加该范围
具体来说,通过使用Batch通过明确包含Beans定义来命名空间
对于StepScope,或者通过使用@EnableBatchProcessing注解。只使用其中一种
那些方法。以下示例使用了BatchNamespace:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:batch="http://www.springframework.org/schema/batch"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="...">
<batch:job .../>
...
</beans>
以下示例明确包含了豆子的定义:
<bean class="org.springframework.batch.core.scope.StepScope" />
工作范围
工作Scope,在Spring Batch 3.0中引入,类似于步配置中的范围
但 是一个工作上下文,因此只有一个这样的豆子实例
每场跑步任务。此外,还支持参考文献的晚装订
可从以下地点访问职位上下文通过#{..}占位符。利用这个功能,你可以拉豆子
来自作业或作业执行上下文的属性以及作业参数。
-
Java
-
XML
以下示例展示了 Java 中绑定到作业范围的示例:
@JobScope
@Bean
public FlatFileItemReader flatFileItemReader(@Value("#{jobParameters[input]}") String name) {
return new FlatFileItemReaderBuilder<Foo>()
.name("flatFileItemReader")
.resource(new FileSystemResource(name))
...
}
@JobScope
@Bean
public FlatFileItemReader flatFileItemReader(@Value("#{jobExecutionContext['input.name']}") String name) {
return new FlatFileItemReaderBuilder<Foo>()
.name("flatFileItemReader")
.resource(new FileSystemResource(name))
...
}
以下示例展示了 XML 中绑定作业范围的示例:
<bean id="..." class="..." scope="job">
<property name="name" value="#{jobParameters[input]}" />
</bean>
<bean id="..." class="..." scope="job">
<property name="name" value="#{jobExecutionContext['input.name']}.txt" />
</bean>
由于默认情况下它不属于 Spring 容器,必须添加该范围
具体来说,通过使用Batch通过明确包含一个 Bean 定义
JobScope,或通过使用@EnableBatchProcessing注释(仅选择一种方法)。
以下示例使用了BatchNamespace:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:batch="http://www.springframework.org/schema/batch"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="...">
<batch:job .../>
...
</beans>
以下示例包含一个豆子,它明确定义了工作范围:
<bean class="org.springframework.batch.core.scope.JobScope" />
| 在多线程中使用作业范围豆子有一些实际限制 或分区步骤。Spring Batch 不控制这些中生成的线程 使用场景,因此无法正确设置它们以使用这些豆子。因此 我们不建议以多线程或分区步骤使用作业范围的 BEANS。 |
范围ItemStream组件
使用 Java 配置风格定义作业或步级范围ItemStream豆
豆定义方法的返回类型至少应为ItemStream.这是必须的
因此 Spring Batch 能够正确创建一个代理来实现该接口,因此
通过呼叫来履行合同打开,更新和关闭方法如预期般。
建议使这些Beans的定义方法得到最具体的回馈 已知实现,如下示例所示:
@Bean
@StepScope
public FlatFileItemReader flatFileItemReader(@Value("#{jobParameters['input.file.name']}") String name) {
return new FlatFileItemReaderBuilder<Foo>()
.resource(new FileSystemResource(name))
// set other properties of the item reader
.build();
}