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

标签 grails spring-batch

我有一个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/

相关文章:

eclipse - 无法使用Java 1.8在Eclipse中构建Grails应用

spring - 如何跳过当前字段集并在 Spring 批处理中继续下一个

spring-batch - 如何使用spring-boot在spring批处理中设置JobParameters

java - Spring批处理作业运行多次

Tomcat 上的 Grails 部署错误

Grails 3.3.3 generate-all <domain class> 只创建服务接口(interface)

grails - 如何在 groovy 域中创建引用关系?

grails - 如何在特定数据源上调用 Grails namedQuery?

spring-batch - JSR 352 Spring Batch 与 Java EE

mysql - Spring 批量推荐表索引