我已经使用参考手册中描述的内容配置了一个批处理,该批处理将每个步骤作为单独的作业运行。
这种方法非常有用,因为我可以将单个批处理作为单个作业直接启动,也可以作为我们称之为“作业网络”的更复杂作业的一部分启动。
例如,我有mainNetJob
:
<import resource="classpath*:/META-INF/spring/batch/jobs/*.xml" />
<job id="mainNetJob"
xmlns="http://www.springframework.org/schema/batch" restartable="true" incrementer="incrementer">
<step id="mainNetJob.closeconnections" next="mainNetJob.userLogout" >
<job ref = "closeconn" job-launcher="syncJobLauncher" job-parameters-extractor="jobParametersExtractor"/>
</step>
<step id="mainNetJob.userLogout" next="mainNetJob.postReminder">
<job ref = "userLogoutJob" job-launcher="syncJobLauncher" job-parameters-extractor="jobParametersExtractor"/>
</step>
<step id="mainNetJob.postReminder" next="mainNetJob.checkMails">
<job ref = "postReminderJob" job-launcher="syncJobLauncher" job-parameters-extractor="jobParametersExtractor"/>
</step>
<step id="mainNetJob.checkMails" >
<job ref = "checkMailsJob" job-launcher="syncJobLauncher" job-parameters-extractor="jobParametersExtractor"/>
</step>
</job>
然后我可以为每个单独的作业定义(即使在保存在文件夹META-INF/spring/batch/jobs
中的单独XML中)。
例如,一劳永逸,在closeconn.xml
我定义了:
<job id = "closeconn" xmlns="http://www.springframework.org/schema/batch" restartable="true" incrementer="incrementer">
<step id="closeconnStepInitUpd" next="closeconn1">
<tasklet ref="closeconnInitUpd"/>
</step>
<step id="closeconn1" next="closeconn2" >
<tasklet>
<chunk reader="closeconnReader1" writer="closeconnWriter"
commit-interval="5" />
</tasklet>
</step>
<step id="closeconn2" >
<tasklet>
<chunk reader="closeconnReader2" writer="closeconnWriter"
commit-interval="5" />
</tasklet>
</step>
</job>
如果我用job-launcher="syncJobLauncher"
运行每个作业,每个步骤将仅在前一个用“asycJobLouncher”结束时执行。我可以决定一起执行部分或全部步骤。
这非常好,100%正常工作!
唯一的问题是:当我在Spring-batch-admin-console
查看作业执行情况时,mainNetJob
我只能看到mainNetJob
的步骤而我无法导航到真正的工作(即closeconn
)。
为什么我需要导航到“真正的”工作?
让我们假设closeconn
作业在mainNetJob.closeconnections
处查看控制台时读取1000条记录。步骤我总是显示0条记录读数,0条写入...这是无用的信息。< / p>
我看一下修改控制台但我很快就意识到我没有关于DB的信息来将“网络”工作的步骤链接到“真正的”工作。为了补丁一段时间,我通过添加列BATCH_JOB_EXECUTION
(即“来自批处理步骤执行”)更改了FROM_BSE_ID
,其中包含开始执行此作业的步骤ID的含义
这显然需要在批处理核心中更改很多类,以便将作业的id写入BATCH_JOB_EXECUTION.FROM_BSE_ID
。
这是因为只有当我在JobStep.doExecute
方法中并且需要将它放在jobExecution
实例类中时才能获得步骤作业的ID“BEFORE”它将被保留。
不幸的是jobExecution
的持久性是由jobLauncher
通过调用job-repository完成的(我在SimpleJobRepository.createJobExecution
中找到了它)。
我发现将stepJobID
类从JobStep
类传递到SimpleJobRepository
类的唯一方法是将其作为JobParameter
传递。这个解决方案有效,但我很恶心。
我不知道我是否很好地解释了这个问题,但我希望如此。 有人可以建议我更好地实现步骤工作和工作之间的联系吗? 这是字符串批量作业的工作方式的变化,可能会引起其他人的兴趣吗?
谢谢你, 佛朗哥