晚期绑定工作属性

之前展示的XML和平面文件示例均使用Spring资源抽象化 获取一份档案。这样做之所以有效,是因为资源getFile返回java.io.file.你可以用标准 Spring 配置 XML 和平面文件资源 构建:spring-doc.cadn.net.cn

以下示例展示了 Java 中的晚绑定:spring-doc.cadn.net.cn

Java 配置
@Bean
public FlatFileItemReader flatFileItemReader() {
	FlatFileItemReader<Foo> reader = new FlatFileItemReaderBuilder<Foo>()
			.name("flatFileItemReader")
			.resource(new FileSystemResource("file://outputs/file.txt"))
			...
}

以下示例展示了XML中的晚绑定:spring-doc.cadn.net.cn

XML 配置
<bean id="flatFileItemReader"
      class="org.springframework.batch.infrastructure.item.file.FlatFileItemReader">
    <property name="resource"
              value="file://outputs/file.txt" />
</bean>

前述资源从指定的文件系统位置加载文件。注意 绝对位置必须以双斜线开头()。大部分春季 应用中,这个解决方案足够好,因为这些资源的名称是 编译时已知。然而,在批处理场景中,文件名可能需要 在运行时确定为作业的参数。这可以通过以下方式求解//-D参数 读取系统属性。spring-doc.cadn.net.cn

以下是如何从Java属性中读取文件名的方法:spring-doc.cadn.net.cn

Java 配置
@Bean
public FlatFileItemReader flatFileItemReader(@Value("${input.file.name}") String name) {
	return new FlatFileItemReaderBuilder<Foo>()
			.name("flatFileItemReader")
			.resource(new FileSystemResource(name))
			...
}

以下示例展示了如何从属性中读取文件名的XML格式:spring-doc.cadn.net.cn

XML 配置
<bean id="flatFileItemReader"
      class="org.springframework.batch.infrastructure.item.file.FlatFileItemReader">
    <property name="resource" value="${input.file.name}" />
</bean>

该解决方案所需的只需一个系统参数(例如-Dinput.file.name=“file://outputs/file.txt”).spring-doc.cadn.net.cn

虽然你可以使用PropertyPlaceholderConfigurer但在这里,情况并非如此 如果系统性质总是被设置,则必然发生,因为资源编辑器春季 已经能过滤并对系统属性进行占位符替换。

通常,在批处理情况下,最好在作业参数作业的(而非通过系统属性)并访问它们 道路。为此,Spring Batch允许对多种文件进行晚期装订工作属性。spring-doc.cadn.net.cn

以下示例展示了如何在 Java 中参数化文件名:spring-doc.cadn.net.cn

Java 配置
@StepScope
@Bean
public FlatFileItemReader flatFileItemReader(@Value("#{jobParameters['input.file.name']}") String name) {
	return new FlatFileItemReaderBuilder<Foo>()
			.name("flatFileItemReader")
			.resource(new FileSystemResource(name))
			...
}

以下示例展示了如何在XML中参数化文件名:spring-doc.cadn.net.cn

XML 配置
<bean id="flatFileItemReader" scope="step"
      class="org.springframework.batch.infrastructure.item.file.FlatFileItemReader">
    <property name="resource" value="#{jobParameters['input.file.name']}" />
</bean>

你可以同时访问作业执行步执行水平执行上下文在 同样的。spring-doc.cadn.net.cn

以下示例展示了如何访问执行上下文在爪哇语中:spring-doc.cadn.net.cn

Java 配置
@StepScope
@Bean
public FlatFileItemReader flatFileItemReader(@Value("#{jobExecutionContext['input.file.name']}") String name) {
	return new FlatFileItemReaderBuilder<Foo>()
			.name("flatFileItemReader")
			.resource(new FileSystemResource(name))
			...
}
Java 配置
@StepScope
@Bean
public FlatFileItemReader flatFileItemReader(@Value("#{stepExecutionContext['input.file.name']}") String name) {
	return new FlatFileItemReaderBuilder<Foo>()
			.name("flatFileItemReader")
			.resource(new FileSystemResource(name))
			...
}

以下示例展示了如何访问执行上下文以XML形式表示:spring-doc.cadn.net.cn

XML 配置
<bean id="flatFileItemReader" scope="step"
      class="org.springframework.batch.infrastructure.item.file.FlatFileItemReader">
    <property name="resource" value="#{jobExecutionContext['input.file.name']}" />
</bean>
XML 配置
<bean id="flatFileItemReader" scope="step"
      class="org.springframework.batch.infrastructure.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中。

阶梯范围

之前展示的所有晚期绑定示例的范围为在 豆子的定义。spring-doc.cadn.net.cn

以下示例展示了 Java 中绑定到 step 作用域的示例:spring-doc.cadn.net.cn

Java 配置
@StepScope
@Bean
public FlatFileItemReader flatFileItemReader(@Value("#{jobParameters[input.file.name]}") String name) {
	return new FlatFileItemReaderBuilder<Foo>()
			.name("flatFileItemReader")
			.resource(new FileSystemResource(name))
			...
}

以下示例展示了 XML 中绑定步域的示例:spring-doc.cadn.net.cn

XML 配置
<bean id="flatFileItemReader" scope="step"
      class="org.springframework.batch.infrastructure.item.file.FlatFileItemReader">
    <property name="resource" value="#{jobParameters[input.file.name]}" />
</bean>

使用一个必须使用晚期结合,因为豆子不能 实际上被实例化直到开始,以便找到属性。 由于默认情况下它不属于 Spring 容器,必须添加该范围 具体来说,通过使用Batch通过明确包含Beans定义来命名空间 对于StepScope,或者通过使用@EnableBatchProcessing注解。只使用其中一种 那些方法。以下示例使用了BatchNamespace:spring-doc.cadn.net.cn

<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>

以下示例明确包含了豆子的定义:spring-doc.cadn.net.cn

<bean class="org.springframework.batch.core.scope.StepScope" />

工作范围

工作Scope,在Spring Batch 3.0中引入,类似于配置中的范围 但 是一个工作上下文,因此只有一个这样的豆子实例 每场跑步任务。此外,还支持参考文献的晚装订 可从以下地点访问职位上下文通过#{..}占位符。利用这个功能,你可以拉豆子 来自作业或作业执行上下文的属性以及作业参数。spring-doc.cadn.net.cn

以下示例展示了 Java 中绑定到作业范围的示例:spring-doc.cadn.net.cn

Java 配置
@JobScope
@Bean
public FlatFileItemReader flatFileItemReader(@Value("#{jobParameters[input]}") String name) {
	return new FlatFileItemReaderBuilder<Foo>()
			.name("flatFileItemReader")
			.resource(new FileSystemResource(name))
			...
}
Java 配置
@JobScope
@Bean
public FlatFileItemReader flatFileItemReader(@Value("#{jobExecutionContext['input.name']}") String name) {
	return new FlatFileItemReaderBuilder<Foo>()
			.name("flatFileItemReader")
			.resource(new FileSystemResource(name))
			...
}

以下示例展示了 XML 中绑定作业范围的示例:spring-doc.cadn.net.cn

XML 配置
<bean id="..." class="..." scope="job">
    <property name="name" value="#{jobParameters[input]}" />
</bean>
XML 配置
<bean id="..." class="..." scope="job">
    <property name="name" value="#{jobExecutionContext['input.name']}.txt" />
</bean>

由于默认情况下它不属于 Spring 容器,必须添加该范围 具体来说,通过使用Batch通过明确包含一个 Bean 定义 JobScope,或通过使用@EnableBatchProcessing注释(仅选择一种方法)。 以下示例使用了BatchNamespace:spring-doc.cadn.net.cn

<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>

以下示例包含一个豆子,它明确定义了工作范围:spring-doc.cadn.net.cn

<bean class="org.springframework.batch.core.scope.JobScope" />
在多线程中使用作业范围豆子有一些实际限制 或分区步骤。Spring Batch 不控制这些中生成的线程 使用场景,因此无法正确设置它们以使用这些豆子。因此 我们不建议以多线程或分区步骤使用作业范围的 BEANS。

范围ItemStream组件

使用 Java 配置风格定义作业或步级范围ItemStream豆 豆定义方法的返回类型至少应为ItemStream.这是必须的 因此 Spring Batch 能够正确创建一个代理来实现该接口,因此 通过呼叫来履行合同打开,更新关闭方法如预期般。spring-doc.cadn.net.cn

建议使这些Beans的定义方法得到最具体的回馈 已知实现,如下示例所示:spring-doc.cadn.net.cn

定义一个具有最具体返回类型的阶梯范围豆
@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();
}