C# 如何在执行之间在Quartz.net作业触发器中持久化数据?

C# 如何在执行之间在Quartz.net作业触发器中持久化数据?,c#,quartz.net,C#,Quartz.net,关于这方面的文章有好几篇,但只有一篇。然而,这个解决方案对我来说毫无意义。我用的是直线 更新: 这: 输出如下: Value Is: Value Is: Value Is: Value Is: Value Is: Value Is: Value Is: 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

关于这方面的文章有好几篇,但只有一篇。然而,这个解决方案对我来说毫无意义。我用的是直线

更新:

这:

输出如下:

Value Is: 
Value Is: 
Value Is: 
Value Is: 
Value Is: 
Value Is: 
Value Is: 
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 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: 
Value Is: 
Value Is: 
Value Is: 
Value Is: 
Value Is: 
Value Is: 
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>
    }

}
我尝试了
context.jobdail.JobDataMap.Put()
context.Trigger.JobDataMap.Put()
它们都没有更新MergedJobDataMap

也许没关系。JobDetail对象和触发器上有一个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

}
public void执行(IJobExecutionContext上下文)
{
字符串x=context.MergedJobDataMap[“field1”];//获取最后一个x
context.Put(“field1”,x);//保存更新的x
}
我试图用x做点什么,让x在两次运行之间保持不变

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

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

您需要设置
context.jobdail.JobDataMap[“field1”]
,以便将其持久化

更新1(基于问题编辑): 如果要保存到触发器数据映射,则需要做更多的工作

如果查看
IJobExecutionContext
中的
Execute()
,您将拥有启动作业的计划程序实例和启动作业的触发器实例。在此处结合信息:

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


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

您的第一个代码片段似乎是正确的。。。取出当前值,将其设置为不同的值(我假设“test string”不是在该类之外设置的值),然后声明存在问题,因为x!=Y这就是我期望的行为。。。自从我改变它以来,x和y是不相等的。我更新了这个问题。如果我按照你说的方式把东西存储在JobDetail中,效果会很好,但是触发失败。我更新了问题。扳机没用。它确实适用于JobDetail。感谢更新。我认为这个解决方案的问题在于它导致了整个工作的重新安排。虽然这肯定会奏效,但这并不是我真正想要的。我有一份工作,有很多触发器,有些可能马上就要触发,有些可能马上就要触发。这将破坏这些。也许这是石英中的一个设计缺陷。很不幸,您答案中的链接已经失效。