Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Grails在没有插件的情况下调度任务_Grails_Scheduled Tasks_Grails 2.0 - Fatal编程技术网

Grails在没有插件的情况下调度任务

Grails在没有插件的情况下调度任务,grails,scheduled-tasks,grails-2.0,Grails,Scheduled Tasks,Grails 2.0,对于我们的一个应用程序,我们有一个不同的任务,我们希望按计划执行。然而,出于几个不同的原因,我们不想麻烦石英 在grails中,我们如何安排可以定期运行的任务?经过一段时间的研究,我们得出了以下结论: 在Groovy源代码包中,我们创建了一个接口 interface Task{ void executeTask() } 接下来,我们创建了我们的任务: class SayHelloTask implements Task{ void executeTask(){ printl

对于我们的一个应用程序,我们有一个不同的任务,我们希望按计划执行。然而,出于几个不同的原因,我们不想麻烦石英


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

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

在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 * * * * *')
  }
}

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

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

grails-app/conf/spring/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会话范围。祝你好运

另一个选项是JDK提供的
Timer
TimerTask
类。您可以在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)

对于记录,从Grails3.2.10开始,可以通过以下方式使用注释巧妙地实现这一点

创建一个普通的Grails服务:

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

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

完成。

您可以添加更多关于Hibernate会话范围的信息吗?我们需要寻找什么?考虑一下您正在创建一个由TaskPayaSpring在Spring中管理的新线程的事实。默认情况下,它没有与之关联的hibernate会话,因为它没有通过Grails来设置会话。您需要使用DomainClass.withNewSession或类似的工具才能获得hibernate会话。您可以随时查看Quartz插件的源代码,看看它是如何处理的,或者查看Executor插件:我同意这在理论上应该是可行的,但是对于这个不起作用的具体情况,有一个开放的bug:。我认为它只适用于注释。我已经成功地使用xml名称空间安排了任务,但没有注释。有没有办法在其计划之外启动此服务以进行测试?这不是我想要的,但我会在以后的项目中记住这一点。另外,它对以后想做同样事情的人也有好处:-)计划任务可以是任何bean中的方法,而不是添加任务!例如,task.scheduled(参考:'beanA',方法:'methodB',cron:'0 0/30****')感谢您的更新!虽然我已经3年多没有做过Grails了,但它应该对某些人有所帮助!
@EnableScheduling
class Application extends GrailsAutoConfiguration {
    static void main(String[] args) {
        GrailsApp.run(Application, args)
    }
}