Spring Batch在多个作业中使用相同的步骤名称?

时间:2012-06-22 08:59:46

标签: java spring spring-batch jobs

我对使用spring-batch 2.1.8.RELEASE命名Spring Batch的约定感到很困惑。

主要问题:

2个不同的作业,但内部具有相同的步骤(将获得不同的属性),这个名称不是唯一的。如果我尝试运行其中一个作业,例如job1。然后它获得prop2的值“file2”,即使它是为job2定义的。 (只是一个抽象示例,没有详细的stepamount,听众等等。)无法弄清楚该过程的任何规律性或原因。

<batch:job id="job1" parent="parentJob">
    <batch:step id="copyFile">
        <batch:tasklet>
            <bean class="xxx.xyz.classXXX"
                scope="step">
                <property name="prop1"
                    value="file1" />
            </bean>
        </batch:tasklet>
    </batch:step>
</batch>

每个作业都在自己的文件中定义。

<batch:job id="job2" parent="parentJob">
    <batch:step id="copyFile">
        <batch:tasklet>
            <bean class="xxx.xyz.classXXX"
                scope="step">
                <property name="prop2"
                    value="file2" />
            </bean>
        </batch:tasklet>
    </batch:step>
</batch>

我们有大约80个工作 - 每个工作都有copyFile作为第一步。但是每个工作中间也有一些步骤,应该平等地命名。是否有可能避免那些注入混乱/失败?除了命名步骤,如“copyFile1”,“copyFile2”等等..

(名称和属性只不过是烟和镜子!)

您还需要更多信息吗?希望我的解释不是太糟糕。提前谢谢!

干杯最多

2 个答案:

答案 0 :(得分:4)

显然,步骤id在春季批次中是全局的(今天检查)。它们在创建上下文时被加载到地图中,并且因为它们具有相同的id,所以步骤读取为上次获胜。

此功能的解决方法:使用不同的步骤ID,例如使用等于batch的前缀:job id,如下所示:

<batch:job id="job1" parent="parentJob">
  <batch:step id="job1_copyFile">
    <batch:tasklet>
      <bean class="xxx.xyz.classXXX" scope="step">
        <property name="prop1" value="file1" />
      </bean>
    </batch:tasklet>
  </batch:step>
</batch>

<batch:job id="job2" parent="parentJob">
  <batch:step id="job2_copyFile">
    <batch:tasklet>
      <bean class="xxx.xyz.classXXX" scope="step">
        <property name="prop2" value="file2" />
      </bean>
    </batch:tasklet>
  </batch:step>
</batch>

答案 1 :(得分:0)

你有两个相互覆盖的匿名bean,因为它们没有设置id属性,尽管它们具有相同的类。

由于具有不同的参数不会区分您的bean,因此它们会被覆盖。

简单地将id属性添加到bean中可以解决您的问题。

   <bean id="file1" class="xxx.xyz.classXXX"
        scope="step">
        <property name="prop1"
            value="file1" />
    </bean>

希望这有助于......