【问题标题】:Schedule Job with custom Trigger and params使用自定义触发器和参数安排作业
【发布时间】:2023-04-05 06:01:01
【问题描述】:

我正在使用 Grails Quartz 插件并希望使用以编程方式创建的触发器来安排我的作业。我事先不知道执行间隔是多少。我希望这项工作无限期地执行。

The docs give some examples 如何安排/触发作业:

== 动态作业调度 ==

从 0.4.1 版本开始,您可以动态安排作业执行。

这些方法可用:

  • MyJob.schedule(String cronExpression, Map params?) 创建 cron 触发器;
  • MyJob.schedule(Long repeatInterval, Integer repeatCount?, Map params?) 创建简单触发器:重复作业 repeatCount+1 次,延迟为 repeatInterval 毫秒;
  • MyJob.schedule(Date scheduleDate, Map params?) 将一项作业执行安排到特定日期;
  • MyJob.schedule(Trigger trigger) 使用自定义触发器安排作业的执行;
  • MyJob.triggerNow(Map params?) 强制立即执行作业。

    每个方法(自定义触发器除外)都采用可选的“参数”参数。您可以使用它将一些数据传递给您的作业,然后从作业中访问它。

Grails 版本 1.3.7 Quartz 插件版本 0.4.2

那么,为什么MyJob.schedule(Trigger trigger) 不接受参数?而且,如何使用自定义触发器和作业的地图或参数来实现我想要的?

【问题讨论】:

    标签: grails quartz-scheduler


    【解决方案1】:

    如果您在Quartz plugin sourcecode 中查看where these methods are defined,您会发现所有采用Map params 的函数都是包装器,它们创建一个Trigger,然后将其发送给调度程序。

    MyJob.schedule(Trigger trigger) 方法只会触发您传递给它的触发器,因此您可以在调用此方法之前将参数添加到 Triggers jobDataMap 属性中,即:

    trigger.jobDataMap.putAll [foo:"It Works!"]
    MyJob.schedule( trigger )
    

    【讨论】:

    • 我得到一个无属性异常...我必须导入一些东西吗?
    【解决方案2】:

    tim 的回答是正确的,这里有一点点更新。

    Trigger trigger = TriggerBuilder
                    .newTrigger()
                    .startNow()
                    .withIdentity("triggerName", "groupName")
                    .withSchedule(
                    SimpleScheduleBuilder.simpleSchedule()
                    .withIntervalInSeconds(5000).repeatForever()
                    ).build();
            trigger.jobDataMap.putAll([foo:"bar"])
            MyJob.schedule(trigger)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-30
      • 1970-01-01
      • 1970-01-01
      • 2021-06-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多