1

我正在创建将定义一个相对简单的 Java 批处理作业的 XML(请参阅 JSR 352)。

我的工作有三个步骤,我希望能够动态地让用户决定他们是要执行所有三个步骤,还是只执行第一步,或者只执行第二步,或者只执行第一步和第三步,或者只是第二步和第三步,等等。基本上我想给用户所有可能的组合,以便按顺序运行步骤的子集。

我感到困惑的是在作业 xml 中定义这种行为。我有一个 javax.batch.api.Decider 的实现,它会根据用户想要做的事情返回一个特定的值。

我的决策者 xml 看起来像这样:

...
<decision id="jobDecisionTree" ref="MyDecider">
    <next on="default" to="defaultFlow"/>
    <next on="stepOneOnly" to="stepOneOnlyFlow"/>
    ...
</decision>
...

我认为最好的方法是使用几个<flow>元素来定义不同的可能性。例如,这里只是我可以定义的两个可能的流程元素:

...   
<flow id="defaultFlow">
  <step id="stepOne" next="stepTwo">
    <chunk checkpoint-policy="item" item-count="20">
        <reader ref="MyStepOneReader"/>
        <processor ref="MyStepOneProcessor"/>
        <writer ref="MyStepOneWriter"/>
    </chunk>
  </step>
  <step id="stepTwo" next="stepThree">
    <chunk checkpoint-policy="item" item-count="20">
        <reader ref="MyStepTwoReader"/>
        <processor ref="MyStepTwoProcessor"/>
        <writer ref="MyStepTwoWriter"/>
    </chunk>
  </step>
  <step id="stepThree">
    <chunk checkpoint-policy="item" item-count="20">
        <reader ref="MyStepThreeReader"/>
        <processor ref="MyStepThreeProcessor"/>
        <writer ref="MyStepThreeWriter"/>
    </chunk>
  </step>
</flow>

<flow id="stepOneOnlyFlow">
  <step id="stepOne">
    <chunk checkpoint-policy="item" item-count="20">
        <reader ref="MyStepOneReader"/>
        <processor ref="MyStepOneProcessor"/>
        <writer ref="MyStepOneWriter"/>
    </chunk>
  </step>
</flow>
...

问题是我不想一遍又一遍地输入所有步骤,因为我的步骤比我在这里介绍的要复杂得多。我有每个步骤的分区和属性,如果我必须将每个步骤的完整定义多次放入作业 xml 文件中,那么冗余 xml 的数量将会很大。

有没有一种方法可以让我只从流程元素中引用一个步骤,而不必每次都完全定义它?

4

0 回答 0