对于我们的某个应用程序,我们有一个不同的任务,我们希望按计划进行。但是,出于几个不同的原因,我们不想打扰石英。
在grails中,我们如何安排可以定期运行的任务?
答案 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提供的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)