的后期绑定JobStep属性

前面显示的 XML 和平面文件示例都使用 SpringResource抽象化 以获取文件。这之所以有效,是因为Resource具有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.item.file.FlatFileItemReader">
    <property name="resource"
              value="file://outputs/file.txt" />
</bean>

前面的Resource从指定的文件系统位置加载文件。注意 绝对位置必须以双斜杠 () 开头。在大多数Spring 应用程序,此解决方案已足够好,因为这些资源的名称为 在编译时已知。但是,在批处理方案中,文件名可能需要 在运行时确定为作业的参数。这可以通过//-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.item.file.FlatFileItemReader">
    <property name="resource" value="${input.file.name}" />
</bean>

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

虽然您可以使用PropertyPlaceholderConfigurer在这里,它不是 如果始终设置 system 属性,则为 necessary ,因为ResourceEditor春季 already 对系统属性进行筛选和执行占位符替换。

通常,在批处理设置中,最好在JobParameters作业中(而不是通过系统属性)并访问它们 道路。为了实现这一点, Spring Batch 允许对各种JobStep属性。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.item.file.FlatFileItemReader">
    <property name="resource" value="#{jobParameters['input.file.name']}" />
</bean>

您可以访问JobExecutionStepExecution水平ExecutionContext在 同样的方式。spring-doc.cadn.net.cn

以下示例显示如何访问ExecutionContext在 Java 中: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))
			...
}

以下示例显示如何访问ExecutionContext在 XML 中:spring-doc.cadn.net.cn

XML 配置
<bean id="flatFileItemReader" scope="step"
      class="org.springframework.batch.item.file.FlatFileItemReader">
    <property name="resource" value="#{jobExecutionContext['input.file.name']}" />
</bean>
XML 配置
<bean id="flatFileItemReader" scope="step"
      class="org.springframework.batch.item.file.FlatFileItemReader">
    <property name="resource" value="#{stepExecutionContext['input.file.name']}" />
</bean>
任何使用后期绑定的 bean 都必须使用scope="step".有关更多信息,请参阅 Step Scope。 一个Stepbean 不应是 step-scoped 或 job-scoped。如果某个步骤中需要后期绑定 definition,然后是该步骤的组件(微线程、项读取/写入器、完成策略等) 是应该改为限定范围的 Scope。
如果你使用 Spring 3.0(或更高版本),step-scoped bean 中的表达式位于 Spring Expression Language,一种强大的通用语言,具有许多有趣的 特征。为了提供向后兼容性,如果 Spring Batch 检测到存在 旧版本的 Spring,它使用一种功能较弱的原生表达式语言,并且 的解析规则略有不同。主要区别在于 Map 键 上面的示例不需要用 Spring 2.5 引用,但引用是强制性的 在 Spring 3.0 中。

Step 范围

前面显示的所有后期绑定示例的 scope 为step在 bean 定义。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.item.file.FlatFileItemReader">
    <property name="resource" value="#{jobParameters[input.file.name]}" />
</bean>

使用Step需要使用后期绑定,因为 Bean 不能 实际上被实例化,直到Step启动,以便找到属性。 因为它默认不是 Spring 容器的一部分,所以必须添加范围 显式地,通过使用batch命名空间,通过显式包含 Bean 定义 对于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>

以下示例显式包含 bean 定义:spring-doc.cadn.net.cn

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

工作范围

Jobscope 类似于Step配置中的 scope but 是Jobcontext,因此只有这样一个 bean 的实例 每个正在运行的作业。此外,还支持引用的后期绑定 可从JobContext通过使用#{..}占位符。使用此功能,您可以拉取 bean 属性以及 Job 参数。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命名空间,通过显式包含 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>

以下示例包括一个 Bean,它显式定义了JobScope:spring-doc.cadn.net.cn

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

范围ItemStream组件

当使用 Java 配置样式定义作业或步骤范围ItemStream豆 Bean 定义方法的返回类型应至少为ItemStream.这是必需的 以便 Spring Batch 正确创建实现此接口的代理,因此 通过调用open,updateclose方法。spring-doc.cadn.net.cn

建议将此类 bean 的 bean 定义方法返回最具体的 已知实现,如以下示例所示:spring-doc.cadn.net.cn

定义具有最具体返回类型的步进作用域 Bean
@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();
}