我有一个Grails应用程序,该应用程序使用SpringBatch插件来控制将文件批量加载到数据库中。我在一个Grails应用程序中有两个批处理配置,我们称它们为OneBatchConfig.groovy
和TwoBatchConfig.groovy
。他们做的事情非常相似,只是处理方式略有不同。例如:
OneBatchConfig.groovy
beans {
xmlns batch:"http://www.springframework.org/schema/batch"
batch.job(id: "batchJob1") {
batch.step(id: 'loadFile') {
batch.tasklet {
batch.chunk(
reader: 'fileReader',
processor: 'compositeProcessor',
writer: 'dbWriter')
}
}
}
// Ignore the fileReader and dbWriter for now
compositeProcessor(CompositeItemProcessor) {
delegates = [
ref('filterInvalidNames'),
ref('filterInvalidDepartments')
]
}
// Ignore the details of the filter* processors
}
}
TwoBatchConfig.groovy
beans {
xmlns batch:"http://www.springframework.org/schema/batch"
batch.job(id: "batchJob2") {
batch.step(id: 'loadFile') {
batch.tasklet {
batch.chunk(
reader: 'fileReader',
processor: 'compositeProcessor',
writer: 'dbWriter')
}
}
}
// Ignore the fileReader and dbWriter for now
compositeProcessor(CompositeItemProcessor) {
delegates = [
ref('filterInvalidNames'),
ref('filterInvalidCities')
]
}
// Ignore the details of the filter* processors
}
}
这两个批处理作业都读入文件,执行一些处理,然后将结果保存到数据库中。每个批处理作业的
fileReader
的配置都不同,例如,它们正在读取不同的文件,但是上面更明显的是,每个作业内部应用的处理是不同的。第一个批处理作业根据名称和部门过滤掉一些记录,而第二个作业根据名称和城市过滤掉一些记录。但是,这些过滤步骤是可配置的,因为第一个作业可能会过滤掉名称='John'的记录,而第二个作业可能会过滤掉名称='Steve'的记录。该配置在批处理作业定义本身内部,而不在代码内部。
所以我的问题是这样的:在我的测试中,这两个
*BatchConfig.groovy
文件中定义的所有bean似乎都是全局 namespace 的一部分;包括步骤名称。这意味着在loadFile
和OneBatchConfig.groovy
中都包含一个称为TwoBatchConfig.groovy
的步骤是一个坏主意,并且在Grails应用程序启动后,这些步骤中只有确实存在。这也意味着filterInvalidNames
bean只能存在一次,因此,相同的过滤将应用于这两个作业(有些看不见)。首先,这种理解正确吗?考虑到其他bean(例如
dataSource
)如何可用而无需做任何事情,这是有道理的。但是,如果是这样,则在单个Grails应用程序中管理大量
*BatchConfig.groovy
文件时,也会造成一些破坏。除了需要为创建的所有*BatchConfig.groovy
文件中的每个步骤和每个bean使用唯一的名称之外,还有其他解决方案吗?喜欢将某种 namespace 应用于每个batch.job块中的Bean名称的功能吗?也许我只是缺少一些简单的方法来配置每个作业,使其与其他作业分开存在?
最佳答案
作业中的组件只是加载到全局Grails(Spring)上下文中的spring bean。这意味着您必须为组件提供全局唯一名称。我只是在每个步骤前面加上作业名称,尽管这可以使一些长的Bean名称成为可能。
如果直接使用spring-batch,则可以使用AutomaticJobRegistrar来解决此问题。 Grails插件当前不执行此操作。我已经在github上对您的问题发表了评论,以反射(reflect)此请求。 https://github.com/johnrengelman/grails-spring-batch/issues/23
关于grails - 一个Grails应用程序中有多个Spring Batch作业,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24946610/