从远程块处理器中的项目编写器访问StepExecutionContext

时间:2014-05-20 09:04:12

标签: spring spring-batch

我实现了一个简单的Spring Batch解决方案,它从XML文件中读取数据并将其写入数据库。该解决方案运行良好,但由于可伸缩性要求,我正在将这个简单的实现转换为使用Remote Chunking的更具伸缩性的实现。我遇到了一个试图从远程ItemWriter访问JobExecutionContext的问题。我的ItemWriter如下所示(为了简洁而删除了非必需品),并且在非远程分块实现中工作正常。

public Object myObject;

public void write(List<? extends Employee> items) throws Exception
{   
    // do stuff
// use myObject here
}

public void beforeStep(StepExecution stepExecution_p)
{
     myObject = stepExecution_p.getJobExecution().getExecutionContext().get("myObject");            
}

但是当我运行远程分块实现时,上面的beforeStep方法没有被调用,所以当稍后调用write方法时,我没有myObject的句柄。我知道在步骤开始之前没有调用before方法,因为ItemReader和ItemWriter是在不同的JVM中分布和运行的,因此无法在远程ItemWriter上调用beforeStep。

我需要找到一种方法来处理我的远程ItemWriter中的steExecutionContext,以便我可以从该上下文中获取myObject。有没有办法让我可以处理远程Item Writer中的stepExecutionContext或任何其他将有用数据传递到远程ItemWriter的方法?我查看了对远程ItemWriter的后期绑定,但显然不支持远程组件的步骤范围(在本例中为ItemWriter)。

<bean id="itemWriterSlave" class="com.....ItemWriterSlave" scope="step"> 
    <property name="myObject" value="#{stepExecutionContext[myObject]}" />
</bean>

有谁知道如何在远程ItemWriter中访问从上一步(通过stepExecutionContext)传递的数据?任何建议都将不胜感激。

1 个答案:

答案 0 :(得分:3)

Spring Batch提供了两种不同的方式来进行多JVM扩展:远程分区和远程分块。远程分区,虽然从属步骤不是包含主步骤的作业的一部分,但它们仍然是具有Spring Batch步骤(访问作业存储库,从属获取StepExecutions等)的所有权限和职责的真正步骤。

然而,远程分块是不同的。奴隶实际上并不是真正的步骤。它们实际上只是主站使用的远程部署组件。因此,他们没有StepExecutions或相关的ExecutionContexts。将数据从先前步骤传递到远程分块中的从属设备的最佳方法是将其保留在作业之外的某个位置。