Grails4调用triggerNow()触发Job报错:MissingMethodException
解决Grails4中Quartz Job调用triggerNow()报MissingMethodException的问题
问题重现
在Grails4应用中手动触发Job时,出现以下错误:
groovy.lang.MissingMethodException: No signature of method: static com.myapp.MyJob.triggerNow() is applicable for argument types: (LinkedHashMap) values: [[foo:It works]]
核心原因
你的MyJob类没有被Grails Quartz插件正确识别并增强:
- Grails Quartz插件2.x(适配Grails4)要求Job类必须添加
@grails.plugins.quartz.Job注解,或者实现org.quartz.Job接口,插件才会为其生成triggerNow()等静态方法。 - 你的Job类只是普通Groovy类,没有满足上述条件,因此不存在
triggerNow()静态方法,调用时自然报错。
解决方案
方案1:为Job添加注解并修正触发代码
- 修改Job类,添加
@Job注解:
package com.myapp import grails.plugins.quartz.Job @Job class MyJob { static triggers = {} def execute(context) { println context.mergedJobDataMap.get('foo') } }
- 控制器中调用
triggerNow()时,直接传入命名参数:
package com.myapp class MyController { def myAction() { MyJob.triggerNow(foo: "It works") } }
方案2:实现Quartz Job接口
如果偏好接口方式,可让Job类实现org.quartz.Job:
package com.myapp import org.quartz.Job import org.quartz.JobExecutionContext class MyJob implements Job { static triggers = {} @Override void execute(JobExecutionContext context) { println context.mergedJobDataMap.get('foo') } }
触发代码同方案1,直接调用MyJob.triggerNow(foo: "It works")即可。
方案3:通过quartzScheduler手动触发
如果不想依赖插件生成的静态方法,可直接使用Quartz原生API触发:
package com.myapp import org.quartz.JobBuilder import org.quartz.TriggerBuilder import org.quartz.JobDetail import org.quartz.Trigger class MyController { def quartzScheduler def myAction() { JobDetail jobDetail = JobBuilder.newJob(MyJob) .usingJobData('foo', 'It works') .build() Trigger trigger = TriggerBuilder.newTrigger() .startNow() .build() quartzScheduler.scheduleJob(jobDetail, trigger) } }
依赖优化(可选)
Grails4推荐使用Gradle的implementation替代compile,修改build.gradle:
implementation 'org.grails.plugins:quartz:2.0.13' implementation 'org.quartz-scheduler:quartz:2.2.1'
内容的提问来源于stack exchange,提问作者mcam11
相关产品推荐
相关产品推荐

