在 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>
我的应用程序中有两个主要的 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>