此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring Batch 文档 5.1.2spring-doc.cn

此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring Batch 文档 5.1.2spring-doc.cn

前面显示的 XML 和平面文件示例都使用 Spring 抽象 以获取文件。这之所以有效,是因为有一个返回 .您可以使用标准 Spring 配置 XML 和平面文件资源 构建:ResourceResourcegetFilejava.io.Filespring-doc.cn

以下示例显示了 Java 中的后期绑定:spring-doc.cn

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

以下示例显示了 XML 中的后期绑定:spring-doc.cn

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

上述内容从指定的文件系统位置加载文件。注意 绝对位置必须以双斜杠 () 开头。在大多数Spring 应用程序,此解决方案已足够好,因为这些资源的名称为 在编译时已知。但是,在批处理方案中,文件名可能需要 在运行时确定为作业的参数。这可以使用参数来解决 读取系统属性。Resource//-Dspring-doc.cn

下面显示了如何从 Java 中的属性读取文件名:spring-doc.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.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.cn

虽然您可以在此处使用 a,但它不是 如果始终设置 system 属性,则是必需的,因为在 Spring 中 already 对系统属性进行筛选和执行占位符替换。PropertyPlaceholderConfigurerResourceEditor

通常,在批处理设置中,最好在作业中参数化文件名(而不是通过系统属性)并访问它们 道路。为了实现这一点, Spring Batch 允许对各种 和 属性进行后期绑定。JobParametersJobStepspring-doc.cn

以下示例演示如何在 Java 中参数化文件名:spring-doc.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.cn

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

您可以在 同样的方式。JobExecutionStepExecutionExecutionContextspring-doc.cn

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

以下示例显示了如何访问 in XML:ExecutionContextspring-doc.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 都必须用 .有关更多信息,请参阅 Step Scope。 bean 不应该是 step-scopes。如果某个步骤中需要后期绑定 定义、该步骤的组件(微线程、项读取器或写入器等) 是应该改为限定范围的 Scope。scope="step"Step
如果你使用 Spring 3.0(或更高版本),step-scoped bean 中的表达式位于 Spring Expression Language,一种强大的通用语言,具有许多有趣的 特征。为了提供向后兼容性,如果 Spring Batch 检测到存在 旧版本的 Spring,它使用一种功能较弱的原生表达式语言,并且 的解析规则略有不同。主要区别在于 Map 键 上面的示例不需要用 Spring 2.5 引用,但引用是强制性的 在 Spring 3.0 中。
虽然您可以在此处使用 a,但它不是 如果始终设置 system 属性,则是必需的,因为在 Spring 中 already 对系统属性进行筛选和执行占位符替换。PropertyPlaceholderConfigurerResourceEditor
任何使用后期绑定的 bean 都必须用 .有关更多信息,请参阅 Step Scope。 bean 不应该是 step-scopes。如果某个步骤中需要后期绑定 定义、该步骤的组件(微线程、项读取器或写入器等) 是应该改为限定范围的 Scope。scope="step"Step
如果你使用 Spring 3.0(或更高版本),step-scoped bean 中的表达式位于 Spring Expression Language,一种强大的通用语言,具有许多有趣的 特征。为了提供向后兼容性,如果 Spring Batch 检测到存在 旧版本的 Spring,它使用一种功能较弱的原生表达式语言,并且 的解析规则略有不同。主要区别在于 Map 键 上面的示例不需要用 Spring 2.5 引用,但引用是强制性的 在 Spring 3.0 中。

Step 范围

前面显示的所有后期绑定示例在 bean 定义。stepspring-doc.cn

以下示例显示了在 Java 中绑定到 step 范围的示例:spring-doc.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.cn

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

使用 scope of 必须使用后期绑定,因为 bean 不能 实际上被实例化直到开始,以便找到属性。 因为它默认不是 Spring 容器的一部分,所以必须添加范围 通过使用名称空间,通过显式地包含 Bean 定义 ,或使用 Annotation。仅使用以下之一 那些方法。以下示例使用命名空间:StepStepbatchStepScope@EnableBatchProcessingbatchspring-doc.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.cn

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

工作范围

JobSpring Batch 3.0 中引入的 scope 类似于配置中的 scope but 是上下文的作用域,因此只有这样一个 bean 的实例 每个正在运行的作业。此外,还支持引用的后期绑定 可从 中使用占位符访问。使用此功能,您可以拉取 bean 属性以及 Job 参数。StepJobJobContext#{..}spring-doc.cn

以下示例显示了在 Java 中绑定到作业范围的示例:spring-doc.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.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 容器的一部分,所以必须添加范围 通过使用名称空间,通过显式包含 JobScope,或使用 Annotation (仅选择一种方法)。 以下示例使用命名空间:batch@EnableBatchProcessingbatchspring-doc.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,该 Bean 显式定义 :JobScopespring-doc.cn

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

范围界定组件ItemStream

当使用 Java 配置样式定义作业或步骤范围的 bean 时, Bean 定义方法的返回类型应至少为 。这是必需的 以便 Spring Batch 正确创建实现此接口的代理,因此 通过按预期调用 、 和 方法来履行其协定。ItemStreamItemStreamopenupdateclosespring-doc.cn

建议将此类 bean 的 bean 定义方法返回最具体的 已知实现,如以下示例所示:spring-doc.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();
}