Spring Batch(引导) - 使用自定义应用程序数据目录进行应用程序配置 - 应用程序使用以前的运行数据而非当前数据

时间:2016-11-28 14:52:46

标签: spring spring-boot spring-batch

我有一个Spring Boot / Batch应用程序。我想使用“app数据目录”(与属性文件不同)与基于数据库的数据存储(即:SQL / Mongo)。

存储在app数据目录中的数据从多个Web服务聚合并存储为XML。作业中的每个步骤都将获取数据并在本地写入,然后链中的下一步将获取创建的文件并处理下一步(等等)。

这里的问题是,每个步骤只会获取以前的应用运行数据。例如,应用程序启动时的数据,而不是步骤执行后的数据。

我理解这里发生了什么,Spring正在检查启动时的所有资源,并在实际运行Step之前按原样使用它们。

请求Spring在应用启动时停止加载指定的资源/文件是否有神奇的技巧?

注意:使用Java Config,而不是XML和最新的Spring / Boot / Batch版本,还为所有读者/编写者尝试了@StepScope

回购:https://github.com/RJPalombo/salesforceobjectreplicator

提前致谢!

1 个答案:

答案 0 :(得分:0)

不,没有魔法: - )

首先,您的代码结构合理,易于理解。

第一件事,在我眼中流行的是:你为什么不使用springbatch的标准读者和作者(FlatFileItemReader / Writer,StaxReader / Writer)。没有必要自己实现这个逻辑。

据我所知,问题是你在读者的构造函数中加载了整个数据。

整个作业结构(连同步骤,读取器,编写器和处理器实例)是在加载弹簧上下文时创建的,在作业实际执行之前。

因此,读者只读空文件。

您可以做的最简单的解决方法是为所有读者和作者实现“ItemStream”界面。

然后在open方法中读取数据,而不是构造函数。在执行步骤之前调用open方法。

但这只是一个快速修复,只有助于理解弹簧弹的行为。这种方法的问题是,所有数据都是一次加载的,这意味着内存使用量会随着数据量的增加而增加;因此,在读取大量数据时,内存会爆炸。在进行批处理时我们不想要的东西。

所以,我建议您查看标准读者和作者。看看它们是如何工作的,调试它们。查看何时调用open / close方法;检查调用read方法时会发生什么以及它的作用。 它并不复杂,看看你的代码,我相信你能够非常快地理解它。