在安装过程中将JobDataMap添加到作业时,Quarts.net计划程序无法添加作业SQL表

时间:2019-11-06 14:26:23

标签: c# quartz-scheduler quartz.net

我在调度包含JobMapData的作业时遇到问题。我正在使用SQL Server保留作业/触发器数据。

当我计划作业而不添加JobMapData时,它们会按预期显示在数据库中,并且我的应用程序完美地执行了作业。但是,当我添加作业所需的JobMapData时,没有触发器/作业数据会插入到表中。

[我的石英配置]

var schedulerConfig = new NameValueCollection
{
    { "quartz.scheduler.instanceName", "TaskScheduler" },
    { "quartz.scheduler.instanceId", "TaskScheduler" },
    { "quartz.threadPool.type", "Quartz.Simpl.SimpleThreadPool, Quartz" },
    { "quartz.threadPool.threadCount", "3"},
    { "quartz.threadPool.threadPriority", "Normal" },
    { "quartz.jobStore.misfireThreshold", "60000"},
    { "quartz.jobStore.type", "Quartz.Impl.AdoJobStore.JobStoreTX, Quartz" },
    { "quartz.jobStore.useProperties", "true" },
    { "quartz.jobStore.dataSource", "default" },
    { "quartz.jobStore.tablePrefix", "_QRTZ_" },
    { "quartz.jobStore.driverDelegateType", "Quartz.Impl.AdoJobStore.SqlServerDelegate, Quartz"},
    { "quartz.dataSource.default.connectionString", "Server=XXXXXXXXXXX; Database=TaskScheduling;Trusted_Connection=True;MultipleActiveResultSets=true" },
    { "quartz.dataSource.default.provider", "SqlServer" },
    { "quartz.serializer.type", "binary"},
};

[作业设置]

IJobDetail job = JobBuilder.Create<SendCyrstalReportJob>()
                    .WithIdentity("SendWorkCenterLoadSummary", "TaskSchedulerService")
                    .WithDescription("Sends the WorkCenterLoadSummary report to a list of email recipients")
                    .UsingJobData("parameters", "MailCrystalReportAsExcel -reportName \\\\fs5\\Reports\\LoadSummary6WeekForecast.rpt -recipients mailrecipient@addy.com")
                    .Build();

ITrigger trigger = TriggerBuilder.Create()
                    .WithIdentity("WorkCenterLoadSummaryTrigger", "TaskSchedulerService")
                    .WithCronSchedule("0/10 * * * * ?")
                    .ForJob("SendWorkCenterLoadSummary", "TaskSchedulerService")
                    .UsingJobData("command", "c:\\CommandConsole\\ecc.exe")
                    .Build();

_scheduler.ScheduleJob(job, trigger);
_scheduler.ListenerManager.AddJobListener(_jobListener);

提供的代码将导致没有作业/触发数据被添加到数据库中。如果我从两者中都注释掉UsingJobData,则作业定义和触发器定义将导致作业被调度并随后按预期执行。

没有引发任何错误,没有向日志文件或控制台窗口报告任何指示问题的消息,只是没有数据进入数据库。

有什么想法吗? :-)

2 个答案:

答案 0 :(得分:0)

我有同样的问题。经过多次尝试/错误后,我找到了以下解决方案:

在调度程序配置中,如下更改此设置:

{ "quartz.jobStore.useProperties", "false" }

将此标志置于“ false”,或将其从配置中删除。如果将其设置为“ true”,则Quartz假定您所有的作业数据映射值都是字符串(根据文档)。就我而言,我在值中发送整数和字符串,并且此更改将其修复。看来,您正在发送值中的字符串,但是您可以尝试更改此设置。 来源:Job Stores Documentation

答案 1 :(得分:0)

将序列化器更改为 json

from { "quartz.serializer.type", "binary"},

from { "quartz.serializer.type", "json"},

并为quartz安装json序列化器