You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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添加注解并修正触发代码

  1. 修改Job类,添加@Job注解:
package com.myapp

import grails.plugins.quartz.Job

@Job
class MyJob {
    static triggers = {}

    def execute(context) {
        println context.mergedJobDataMap.get('foo')
    }
}
  1. 控制器中调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 18:10:30