1

我在 Spring Batch 项目中有三个不同的 .properties 文件,我正在尝试设置应将哪个 .properties 文件用作 JobParameter。我希望能够像这样运行这项工作:

java CommandLineJobRunner context.xml jobName region=us

该区域应指定应使用哪个 .properties 文件。问题是获取上下文以识别 JobParameter。我尝试了以下方法无济于事:

<context:property-placeholder location="classpath:batch.#{jobParameters['region']}.properties"/>

并且:

<util:properties id="batchProperties" location="classpath:batch.#{jobParameters['region']}.properties"></util:properties>

我听说添加 scope="step" 可以解决类似的问题,但我尝试将其添加到上述两个解决方案中,但仍然有例外。

我想我错过了为什么我不能让它工作的基本想法,但我无法弄清楚这个想法是什么。

如果有人对如何使这项工作和/或解释我以前的方法失败的原因有任何建议,我将不胜感激。

4

1 回答 1

4

这不是正确的方法(不可能做你想做的事)。
您必须认为它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" />
于 2013-08-29T21:36:52.080 回答