此版本仍在开发中,尚不被认为是稳定的。对于最新的稳定版本,请使用 Spring Batch 文档 5.2.2! |
后期绑定Job
和Step
属性
前面显示的 XML 和平面文件示例都使用 SpringResource
抽象化
以获取文件。这之所以有效,是因为Resource
有一个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>
前面的Resource
从指定的文件系统位置加载文件。注意
绝对位置必须以双斜杠 () 开头。在大多数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 在这里,它不是
如果始终设置系统属性,则必要,因为ResourceEditor 在Spring
已经过滤并对系统属性进行占位符替换。 |
通常,在批处理设置中,最好在JobParameters
(而不是通过系统属性)并访问它们
道路。为了实现这一点,Spring Batch 允许将各种Job
和Step
属性。
-
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>
您可以访问JobExecution
和StepExecution
水平ExecutionContext
在
同样的方式。
-
Java
-
XML
以下示例演示如何访问ExecutionContext
在 Java 中:
@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))
...
}
以下示例演示如何访问ExecutionContext
在 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>
任何使用后期绑定的 bean 都必须使用scope="step" .有关详细信息,请参阅步骤范围。
一个Step bean 不应该是步进作用域或作业作用域。如果步骤中需要延迟绑定
定义,然后是该步骤的组件(任务、项执行/编写器、完成策略等)
是应该限定范围的。 |
如果您使用 Spring 3.0(或更高版本),则步进作用域 bean 中的表达式位于 Spring 表达式语言,一种功能强大的通用语言,具有许多有趣的 特征。为了提供向后兼容性,如果 Spring Batch 检测到 旧版本的 Spring,它使用一种功能较弱的原生表达式语言,并且 其解析规则略有不同。主要区别在于地图键入 上面的例子不需要在 Spring 2.5 中引用,但引号是强制性的 在 Spring 3.0 中。 |
步骤范围
前面显示的所有后期绑定示例的范围为step
在
bean 定义。
-
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>
使用Step
需要使用后期绑定,因为 bean 不能
实际上被实例化,直到Step
开始,以便找到属性。
因为默认情况下它不是 Spring 容器的一部分,所以必须添加作用域
显式地,通过使用batch
命名空间,通过显式包含 bean 定义
对于StepScope
,或使用@EnableBatchProcessing
注解。仅使用以下一种
那些方法。以下示例使用batch
Namespace:
<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 class="org.springframework.batch.core.scope.StepScope" />
工作范围
Job
scope 中引入的 Spring Batch 3.0 类似于Step
配置中的范围
但是一个作用域Job
上下文,因此只有一个这样的 bean 实例
每个正在运行的作业。此外,还支持引用的延迟绑定
可从JobContext
通过使用#{..}
占位符。使用此功能,您可以拉豆
作业或作业执行上下文和作业参数中的属性。
-
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
注释(仅选择一种方法)。
以下示例使用batch
Namespace:
<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 显式定义了JobScope
:
<bean class="org.springframework.batch.core.scope.JobScope" />
在多线程中使用作业范围的 Bean 存在一些实际限制 或分区步骤。Spring Batch 不控制在这些 用例,因此无法正确设置它们以使用此类 bean。因此 我们不建议在多线程或分区步骤中使用作业范围的 Bean。 |
范围ItemStream
组件
使用 Java 配置样式定义作业或步骤范围时ItemStream
豆
bean 定义方法的返回类型应至少为ItemStream
.这是必需的
以便 Spring Batch 正确创建实现此接口的代理,因此
通过调用open
,update
和close
方法。
建议让这类 bean 的 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();
}