Grails CSV插件 - 并发

时间:2016-05-09 09:49:07

标签: grails grails-plugin grails-2.0 grails-controller gpars

我正在使用 Grails 2.5.3 在我的应用程序中使用插件: Grails CSV插件。 我需要实现并发功能,例如: GPars ,但我不知道如何做到这一点。

现在,配置是顺序处理。我的代码片段示例:

感谢。

1 个答案:

答案 0 :(得分:1)

在这种情况下实现并发可能不会带来很多好处。这实际上取决于瓶颈在哪里。例如,如果瓶颈在于读取CSV文件,则没有什么优势,因为文件只能按顺序读取。除此之外,这是我能提出的最简单的例子:

import groovyx.gpars.GParsPool

def tokens = csvFileLoad.inputStream.toCsvReader(['separatorChar': ';', 'charset': 'UTF-8', 'skipLines': 1]).readAll()
def failedSaves = GParsPool.withPool {
    tokens.parallel
        .map { it[0].trim() }
        .filter { !Department.findByName(it) }
        .map { new Department(name: it) }
        .map { customImportService.saveRecordCSVDepartment(it) }
        .map { it ? 0 : 1 }
        .sum() 
}

if(failedSaves > 0) transactionStatus.setRollbackOnly()

如您所见,首先读取整个文件;因此是主要的瓶颈。大部分处理与map()filter()sum()方法同时进行。最后,如果Department中的任何一个未能保存,则回滚事务。

注意:我选择使用map() - sum()对,而不是使用anyParallel(),以避免将map()生成的并行数组转换为常规Groovy集合,执行anyParallel(),它创建一个并行数组,然后将其转换回Groovy集合。

改进

正如我在我的示例中已经提到的,在并发执行开始之前,首先完全读取CSV文件。它还会尝试保存所有Department实例,即使一个实例无法保存。你可能想要(也就是你所展示的)。