在 2 个自动注册的作业中使用相同的 jobStep - Spring 批处理

Use of the same jobStep in 2 automatically registered Jobs - Spring Batch

我的应用程序中有两个主要的 Spring 批次,它们自动注册到

 <bean id="jobRegistrar" class="org.springframework.batch.core.configuration.support.AutomaticJobRegistrar">
    <property name="applicationContextFactories">
        <bean class="org.springframework.batch.core.configuration.support.ClasspathXmlApplicationContextsFactoryBean">
            <property name="resources"
                      value="classpath*:/management/*Job_Context.xml"/> <!-- 2 conf files -->
        </bean>
    </property>
    <property name="jobLoader">
        <bean class="org.springframework.batch.core.configuration.support.DefaultJobLoader">
            <property name="jobRegistry" ref="jobRegistry"/>
        </bean>
    </property>
</bean>

一切都很好,直到我决定使用带有自定义参数提取器的 jobstep,以便在两个作业中重复使用。我只是在两个作业 conf 文件中添加:

<beans:import resource="classpath:myJobStepDefinition.xml" />
...
<step id="mySecondaryJob.step">
                <job ref="mySecondaryJob" job-launcher="jobLauncher"
                     job-parameters-extractor="firstJobParametersExtractor"/> <!-- or second -->
</step>

问题是,当我在两个 conf 文件中导入 myJobStepDefinition.xml 时,我得到一个错误:作业已经注册(我的猜测是 jobregistrar 在 conf 文件中为每个作业定义注册了一个作业)。

在国内,如果我摆脱导入并自动注册 jobstep(例如通过将 myJobStepDefinition.xml 重命名为 thirdJob_Context.xml),那么我会得到一个错误 "cannot resolve bean mySecondaryJob"。

然后就不能将 jobsteps 与 AutomaticJobRegistrar 一起使用了吗?还是我错过了什么?

正如 Michael Pralow 所说,可以使用继承来解决该问题。

在这种情况下,共享作业 mySecondaryJob 必须是抽象的。

当必须使用它时(作为另一个作业的步骤),必须创建一个非抽象的子作业。注意,如果你想共享流程或步骤,你必须将这些流程/步骤的定义外部化,因为它不能在抽象作业中使用(但听众可以)。在下面的示例中,我采用了我的工作只有一个步骤的简单情况。

<job id="myFirstChildJob" parent="mySecondaryJob" abstract="false"> <!-- abstract is false by default -->
    <step id="myFirstChildStep" parent="myAbstractSharedStep"/>
</job>