gpt4 book ai didi

grails - 一个Grails应用程序中有多个Spring Batch作业

转载 作者:行者123 更新时间:2023-12-02 14:42:57 25 4
gpt4 key购买 nike

我有一个Grails应用程序,该应用程序使用SpringBatch插件来控制将文件批量加载到数据库中。我在一个Grails应用程序中有两个批处理配置,我们称它们为OneBatchConfig.groovyTwoBatchConfig.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 的一部分;包括步骤名称。这意味着在 loadFileOneBatchConfig.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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com