Grails在没有插件的情况下安排任务

时间:2014-04-16 16:43:36

标签: grails scheduled-tasks grails-2.0

对于我们的某个应用程序,我们有一个不同的任务,我们希望按计划进行。但是,出于几个不同的原因,我们不想打扰石英。

在grails中,我们如何安排可以定期运行的任务?

4 个答案:

答案 0 :(得分:5)

经过一段时间的研究,我们得出了这样的结论:

在Groovy源包中,我们创建了一个接口

interface Task{
  void executeTask()
}

接下来我们创建了我们的任务:

class SayHelloTask implements Task{
    void executeTask(){
    println "Hello"
  }
}

resources.groovy文件中,我们添加了以下内容:

import package.SayHelloTask
beans = {
  sayHelloTask(SayHelloTask){
  }

  xmlns task: "http://www.springframework.org/schema/task"

  task.'scheduled-tasks'{
    task.scheduled(ref:'retryEmailTask', method: 'executeTask', cron: '0-59 * * * * *')
  }
}

我们采用这种解决方案,因为它减少了Quartz的开销。它与我们在Java项目中的工作方式相匹配。

答案 1 :(得分:5)

在处理基于Spring的计划任务时,我更喜欢使用我的服务上的注释。

<强>的grails-app / CONF /弹簧/ resrouces.groovy

beans {
    xmlns task: "http://www.springframework.org/schema/task"
    task.'annotation-driven'('proxy-target-class': true)
}

然后我的服务:

class MyService {
  @Scheduled(cron="*/5 * * * * MON-FRI")
  void doSomething() {
    ...    
  }
}

无论你如何做到这一点,都要谨慎对待你的Hibernate会话范围。祝你好运!

答案 2 :(得分:3)

对于记录,从Grails 3.2.10开始,可以通过以下方式使用注释来巧妙地实现。

创建一个普通的Grails服务:

class ScheduledService {
  boolean lazyInit = false    // <--- this is important

  @Scheduled(fixedRate = 20000L)
  def myBusinessMethodForTheJob() {
    log.info 'Executing scheduled job...'
  }
}

在应用程序中启用计划:

@EnableScheduling
class Application extends GrailsAutoConfiguration {
    static void main(String[] args) {
        GrailsApp.run(Application, args)
    }
}

完成。

答案 3 :(得分:2)

另一个选项是JDK提供的TimerTimerTask类。您可以在Groovy控制台中运行此示例以查看其实际操作

def task = new TimerTask() {

  void run() {
    println "task running at ${new Date()}"
  }
}

def firstExecutionDelay = 1000
def delayBetweenExecutions = 2000

new Timer(true).schedule(task, firstExecutionDelay, delayBetweenExecutions)