【问题标题】:Update an existing JobDataMap更新现有的 JobDataMap
【发布时间】:2010-05-13 19:35:47
【问题描述】:

我有一个已经安排好的 Quartz 作业。我想更新与之关联的 JobDataMap。如果我得到一个带有JobDataMap jobDataMap = scheduler.getJobDetail(....).getJobDataMap() 的 JobDataMap,那张地图是“活的”吗? IE。如果我更改它,它会保留在调度程序中吗?如果没有,我该如何坚持?

【问题讨论】:

    标签: java persistence quartz-scheduler


    【解决方案1】:

    在石英 2.0 中。 StatefulJob 已弃用。为了持久化作业数据映射,请在作业类上使用@PersistJobDataAfterExecution。它通常与@DisallowConcurrentExecution 一起使用。

    【讨论】:

    • 但是在哪个表中可以找到JobDataMap的信息,我查了所有的表都没有找到。
    • 是QRTZ_JOB_DETAILS表的Job_data列吗?
    • 不知道,我没有配置jobs的数据库持久化
    • 是的,信息可以在 QRTZ_JOB_DETAILS 表中找到。
    • 棘手的部分是在作业类中写下PersistJobDataAfterExecution和DisallowConcurrentExecution这两个注解
    【解决方案2】:

    我遇到了类似的问题:我有一个第二触发器,它会触发一个在作业数据映射中的队列上工作的有状态作业。每次作业触发时,它都会从队列中进行轮询并对被轮询的元素执行一些工作。每次执行作业时,队列都会少一个元素(队列会在作业中正确更新)。当队列为空时,作业会自行取消调度。

    我希望能够从外部更新正在进行的作业/触发器的参数列表,以便为队列提供更多参数。但是,仅检索数据映射并更新队列是不够的(以下执行显示队列未更新)。问题是 Quartz 只在执行后更新作业实例的作业数据映射。

    这是我找到的解决方案:

    JobDetail jobDetail = scheduler.getJobDetail("myJob", "myGroup");
    jobDetail.getJobDataMap.put("jobQueue", updatedQueue);
    scheduler.addJob(jobDetail, true);
    

    最后一行指示 Quartz 将存储的作业替换为您提供的作业。下次触发作业时,它将看到更新的队列。

    【讨论】:

    • 最新版本的 Quartz (2.6.10?) 似乎有这个问题
    • 对不起 - 那是 2.1.7 版...以前在 2.1.6 上工作正常
    【解决方案3】:

    http://www.quartz-scheduler.org/docs/tutorial/TutorialLesson03.html:

    一个 Job 实例可以定义为 “有状态”或“无状态”。 无状态的工作只有他们的 JobDataMap 存储在它们的时间 添加到调度程序。这表示 对内容所做的任何更改 执行期间的作业数据映射 的工作将丢失,并且不会 下次被工作看到 执行。

    ...有状态的工作正好相反—— 其 JobDataMap 后重新存储 每次执行作业。

    您可以通过让 Job 实现 StatefulJob 来将其“标记”为有状态 界面,而不是作业 界面。

    【讨论】:

    • 但是如果我想从执行之外更新作业怎么办?例如来自 JMX?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-20
    • 1970-01-01
    • 1970-01-01
    • 2012-03-10
    • 2019-02-19
    • 1970-01-01
    相关资源
    最近更新 更多