【问题标题】:How to persist data in a Quartz.net job Trigger between executions?如何在执行之间在 Quartz.net 作业触发器中保留数据?
【发布时间】:2014-10-06 23:49:45
【问题描述】:

有几篇关于此的 SO 文章,但只有一篇 directly addresses this issue。但是,该解决方案对我来说没有意义。我用的是直弦。

更新:

这个:

[PersistJobDataAfterExecution]
public class BackgroundTaskTester : IJob
{
    public void Execute(IJobExecutionContext context)
    {
        Debug.WriteLine("Value Is: " + context.Trigger.JobDataMap["field1"] as string);
        context.Trigger.JobDataMap["field1"] = DateTimeOffset.Now.ToString();
    }
}

输出:

Value Is: 
Value Is: 
Value Is: 
Value Is: 
Value Is: 
Value Is: 
Value Is: 

但是这个:

[PersistJobDataAfterExecution]
public class BackgroundTaskTester : IJob
{
    public void Execute(IJobExecutionContext context)
    {
        Debug.WriteLine("Value Is: " + context.JobDetail.JobDataMap["field1"] as string);
        context.JobDetail.JobDataMap["field1"] = DateTimeOffset.Now.ToString();
    }
}

输出:

Value Is: 10/6/2014 9:26:23 AM -05:00
Value Is: 10/6/2014 9:26:28 AM -05:00
Value Is: 10/6/2014 9:26:33 AM -05:00

但是,我想将内容存储在 触发器 中。如何让触发器持续存在?

原始问题:

我有一堂课:

[PersistJobDataAfterExecution]
public class BackgroundTaskNotification : IJob
{
    public void Execute(IJobExecutionContext context)
    {
        <see below>
    }

}

以下代码未按预期运行:

public void Execute(IJobExecutionContext context)
{
    string x = context.MergedJobDataMap["field1"];

    context.Put("field1", "test string");

    string y = context.MergedJobDataMap["field1"];

    // PROBLEM: x != y
}

我试过context.JobDetail.JobDataMap.Put()context.Trigger.JobDataMap.Put() 他们都没有更新 MergedJobDataMap。

也许没关系。 JobDetail 对象和 Trigger 上有一个 JobDataMap。我想要做的是:

public void Execute(IJobExecutionContext context)
{
    string x = context.MergedJobDataMap["field1"];  //get last x

    <do something with x>

    context.Put("field1", x);  //save updated x

}

我正在尝试对 x 做一些事情,并让 x 在运行之间保持不变。

我不确定它是否相关,但我会补充一点,当我创建作业时,我实际上将field1 放入了触发器的JobDataMap。这是因为我有一个 Job 和多个触发器。我希望数据存储在跳跳虎级别。

【问题讨论】:

  • 您的第一个代码 sn-p 似乎是正确的...您提取当前值,将其设置为不同的值(我假设“测试字符串”不是您在此类之外设置的值) ,然后您声称存在问题,因为 x != y。这就是我所期望的行为......自从我改变它以来,x 和 y 是不相等的。
  • 我更新了问题。如果我按照您所说的方式将内容存储在 JobDetail 中,但在触发器中失败。

标签: c# quartz.net


【解决方案1】:

原答案

MergedDataMap 是 TriggerDataMap 和 JobDataMap 的组合(触发器条目覆盖作业条目)。更新它不会做任何事情,因为它不会将更改传播回原始 JobDataMap 或 TriggerDataMap,并且它只是重新持久化的 JobDataMap。

您想设置 context.JobDetail.JobDataMap["field1"] 以使其持久化。

更新 1(基于问题编辑):

如果你想保存到触发器数据图,你必须做更多的工作。

如果您查看IJobExecutionContext,您会看到Execute(),您有一个启动作业的调度程序实例,以及一个启动该作业的触发器实例。在此处结合信息:

Update Quart.NET Trigger

在作业执行过程中更新触发器。请注意,这会立即更新触发器,而不是在作业运行之后(如 Quartz 为您管理作业数据时)。

这也可以适用于作业的数据映射,并在作业执行结束时立即保留更改而不是自动保留。

【讨论】:

  • 我更新了问题。它对触发器不起作用。它确实适用于 JobDetail。
  • 感谢您的更新。我认为该解决方案的问题在于它导致整个工作的重新安排。虽然这肯定会奏效,但这并不是我真正想要的。我的工作有很多触发器,有些可能现在正在解雇,有些可能迫在眉睫。这会打乱那些。也许这是 Quartz 中的设计差距。
  • 不幸的是,您的答案中的链接已失效。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多