gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 14:33:40 25 4
gpt4 key购买 nike

有几篇关于此的 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 对象和触发器上有一个 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 和多个触发器。我希望将数据存储在 tigger 级别。

最佳答案

原答案

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

您要设置context.JobDetail.JobDataMap["field1"]以便它能够持久化。

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

如果要保存到触发器数据映射,则必须做更多工作。

如果您查看 IJobExecutionContext您在 Execute() 中得到,您有一个启 Action 业的调度程序实例和一个启 Action 业的触发器实例。结合这里的信息:

Update Quart.NET Trigger

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

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

关于c# - 如何在执行之间的 Quartz.net 作业触发器中保留数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26150194/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com