4

我对使用 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”等。

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

您需要任何进一步的信息吗?希望我的解释不会太糟糕。先感谢您!

欢呼最大。

4

2 回答 2

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>
于 2013-09-13T13:41:43.200 回答
0

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

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

只需将 id 属性放入您的 bean 即可解决您的问题。

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

希望这会有所帮助...

于 2012-06-22T13:05:35.827 回答