我正在创建将定义一个相对简单的 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 的数量将会很大。
有没有一种方法可以让我只从流程元素中引用一个步骤,而不必每次都完全定义它?