首页 > 解决方案 > 如何读取 Quartz.Net 作业的 JOB_DATA?

问题描述

我有一个读取和写入 IJobExecutionContext.JobDetail.JobDataMap 的 Quartz 作业,并且数据(似乎是)保存在 dbo.QRTZ_JOB_DETAILS 的 JOB_DATA 列中。

虽然这工作正常(作业的每次运行都读取/写入持久数据),但我想(从 Quartz 作业本身的上下文之外)查询JobDataMap 中的值。理想情况下,我也希望能够写出这份工作的价值观。

我可以(大概)从 SQL 数据表中读取该列,并将其反序列化回 JobDetail 对象(?),但这似乎有点“后门”——我不确定如何反序列化它。

或者,也许我可以实例化一些 Quartz 对象来为我完成繁重的工作。例如(伪代码)

var jobDetail = Quartz.JobDetail.Deserialize("MyJob")

var jobDataMap = jobDetail.JobDataMap;
var key = "MyKey";

var oldValue = jobDataMap.Contains(key) ? jobDataMap.GetIntValue(key) : 0;

var newValue = fnCrazyCalculation(oldValue);

jobDataMap.PutAsString(key, newValue);

有什么建议么 ?

*** 编辑 ***

我尝试创建一个这样的实例:

    var schedulerFactory = new StdSchedulerFactory();
    var scheduler = schedulerFactory.GetScheduler();

    var jobKey = new Quartz.JobKey("MyJob","Work");
    var jobDetail = scheduler.GetJobDetail(jobKey);

...但这似乎需要在 app.config 中设置 Quartz 属性,但我不确定我是否可以设置刚好足以从数据库中获取作业详细信息。

IE。我从实际的 Job 项目中复制了这个:

  <quartz>
    <add key="quartz.plugin.xml.type" value="Quartz.Plugin.Xml.XMLSchedulingDataProcessorPlugin, Quartz" />
    <add key="quartz.plugin.xml.fileNames" value="~/QuartzJobs.xml" />
    <add key="quartz.dataSource.quartzDataSource.connectionStringName" value="ConsoleApp3.Properties.Settings.Quartz" />
    <add key="quartz.dataSource.quartzDataSource.provider" value="SqlServer-20" />
    <add key="quartz.jobStore.type" value="Quartz.Impl.AdoJobStore.JobStoreTX, Quartz" />
    <add key="quartz.jobStore.driverDelegateType" value="Quartz.Impl.AdoJobStore.SqlServerDelegate, Quartz" />
    <add key="quartz.jobStore.dataSource" value="quartzDataSource" />
    <add key="quartz.jobStore.tablePrefix" value="QRTZ_" />
    <add key="quartz.jobStore.clustered" value="true" />
    <add key="quartz.scheduler.instanceId" value="AUTO" />
  </quartz>

...但这似乎需要 QuartzJobs.xml 定义和实际实现该作业的类。

标签: c#quartz.net

解决方案


推荐阅读