有一些关于此的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级别。
答案 0 :(得分:1)
MergedDataMap是TriggerDataMap和JobDataMap的组合(触发条目覆盖作业条目)。更新它不会做任何事情,因为它不会将更改传播回原始JobDataMap或TriggerDataMap,并且它只是重新保留的JobDataMap。
您希望设置context.JobDetail.JobDataMap["field1"]
以便将其保留。
如果要保存到触发器数据图,则必须多做一些工作。
如果查看IJobExecutionContext
中给出的Execute()
,则会有一个启动作业的调度程序实例,以及启动该作业的触发器实例。结合信息:
在作业执行过程中更新触发器。请注意,这会立即更新触发器 ,而不是在作业运行之后(就像Quartz为您管理作业数据时那样)。
这也可以适用于作业的数据映射,并在作业执行结束时立即与自动保持更改。