如何在Quartz.net作业中保留数据在执行之间触发?

时间:2014-10-01 20:38:48

标签: c# quartz.net

有一些关于此的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

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

原始问题:

我有一个班级:

[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放入触发器{{1 \ n} }}。这是因为我有一个Job和多个触发器。我希望数据存储在tigger级别。

1 个答案:

答案 0 :(得分:1)

原始答案

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

您希望设置context.JobDetail.JobDataMap["field1"]以便将其保留。

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

如果要保存到触发器数据图,则必须多做一些工作。

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

Update Quart.NET Trigger

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

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