错过了“步骤作业”与作业网络定义中的作业之间的链接

时间:2014-07-22 08:05:55

标签: java spring spring-batch

我已经使用参考手册中描述的内容配置了一个批处理,该批处理将每个步骤作为单独的作业运行。 这种方法非常有用,因为我可以将单个批处理作为单个作业直接启动,也可以作为我们称之为“作业网络”的更复杂作业的一部分启动。 例如,我有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传递。这个解决方案有效,但我很恶心。

我不知道我是否很好地解释了这个问题,但我希望如此。 有人可以建议我更好地实现步骤工作和工作之间的联系吗? 这是字符串批量作业的工作方式的变化,可能会引起其他人的兴趣吗?

谢谢你, 佛朗哥

0 个答案:

没有答案