Grails中的Quartz Scheduler

时间:2012-01-11 09:33:53

标签: grails groovy quartz-scheduler

我有OperationLog类,我创建了1000条记录,其中包含另一个名为Validator的类提供的信息。

def list = {
        params.max = Math.min(params.max ? params.int('max') : 10, 100)
        [operationLogInstanceList: OperationLog.list(params), operationLogInstanceTotal: OperationLog.count()]
    }

    def create = {
        def operationLogInstance = new OperationLog()
        operationLogInstance.properties = params
        operationLogInstance.validator = Validator.get(params.validatorId)
        operationLogInstance.operation = Operation.get(params.operationId)
        return [operationLogInstance: operationLogInstance]
    }

    def save = {
        int i = 0;
    1000.times {
        def operationLogInstance = new OperationLog(params)
        operationLogInstance.validator = Validator.get((i));
        operationLogInstance.save(flush: true)                   
        i ++;
    }
    redirect(action: "list")
    }
}

我的问题是这个。如何在石英调度程序的帮助下逐一创建这些记录,每个记录应在5分钟内保存。

注意:我已经创建了一份工作(MyJob.groovy)。我的执行和触发器方法都是空的。

1 个答案:

答案 0 :(得分:2)

据我了解,您从用户那里获取数据?你想保存这个数据1000次,每5分钟一次? 所以你想调用一个服务来做这个(数据作为参数)?

所以这可以通过线程完成(任何地方,也应该在控制器中工作......

Thread.start {
    1000.times {
        def operationLogInstance = new OperationLog(params)
        println(params.validator)
        operationLogInstance.validator = Validator.get(params.validator.id);
        operationLogInstance.save(flush: true)                   
    }
    wait(300000)
}

可能需要围绕它运行一个OperationLog.withSession {...}。

或者你可以提供一个quatz作业(使用保存你要保存的日志的服务......),如下所示:

class OperationLogJob {

static triggers = {
    simple name:'Operation Save', startDelay:0, repeatInterval:300000
}

def sessionRequired = true

def concurrent = false

def operationsLogService

def execute() {
    def operationLogInstance = operationsLogService.getLogsToSave()
    if(operationLogInstance) {
            operationLogInstance.validator = Validator.get(params.validator.id);
            operationLogInstance.save(flush: true)                   
        }
    }       
}

}

operationsLogService.getLogsToSave()方法返回(并删除)可以填充控制器方法的堆栈中的值(例如1000.times {operationsLogService.addLog(log)})