这不是正确的方法(不可能做你想做的事)。
您必须认为它jobParameters
仅在作业运行时可用,并且仅适用于标记为scope="step"
(并且没有<context:property-placeholder>
也没有<util:properties>
属性step
)的组成步骤。
解决该问题的一种方法是在使用侦听器运行第一步之前在作业的执行上下文中加载属性文件:
public class PropertyLoaderJobExecutionListener extends StepExecutionListenerSupport {
Properties countryProperties;
public void setCountryProperties(Properties pfb) {
this.countryProperties = pfb;
}
@Override
public void beforeStep(StepExecution stepExecution) {
super.beforeStep(stepExecution);
// Store property file content in jobExecutionContext with name "batchProperties"
stepExecution.getJobExecution().getExecutionContext().put("batchProperties", countryProperties);
}
}
在你的 job.xml
<bean id="loadPropertiesListener" class="PropertyLoaderJobExecutionListener" scope="step">
<property name="pfb">
<bean class="org.springframework.beans.factory.config.PropertiesFactoryBean">
<property name="location" value="classpath:batch.#{jobParameters['region']}.properties" />
</bean>
</property>
</bean>
并在您的第一步中注册此侦听器(您不能在您的中这样做,JobExectionListsner.beforeJob()
因为现在没有 ascope="job"
并且值的后期绑定#{jobParameters['region']}
不可用)。
要使用 spEL 访问您的数据,请使用以下语法:
#{jobExecutionContext.get('batchProperties').getProperty('language')}
或更好的语法来访问属性(IDK spEL 太好了,抱歉)。
希望清楚并可以帮助解决您的问题。
编辑(我的工作 job.xml 的完整代码):
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="http://www.springframework.org/schema/batch http://www.springframework.org/schema/batch/spring-batch-2.2.xsd
http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-util-3.1.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd">
<job id="sourceJob" xmlns="http://www.springframework.org/schema/batch">
<step id="step1">
<tasklet ref="getRemoteFileTasklet" />
<listeners>
<listener ref="loadPropertiesListener" />
</listeners>
</step>
</job>
<bean id="loadPropertiesListener" class="PropertyLoaderJobExecutionListener" scope="step">
<property name="pfb">
<bean class="org.springframework.beans.factory.config.PropertiesFactoryBean">
<property name="location" value="classpath:batch.#{jobParameters['region']}.properties" />
</bean>
</property>
</bean>
<bean id="getRemoteFileTasklet" class="GetRemoteFileTasklet" />