我在asp.net mvc应用程序中使用quartz.net。
尝试将其配置为用户ADOStore。
我创建了表格。
NameValueCollection properties = new NameValueCollection();
properties["quartz.scheduler.instanceName"] = "TestScheduler";
properties["quartz.scheduler.instanceId"] = "instance_one";
properties["quartz.jobStore.type"] = "Quartz.Impl.AdoJobStore.JobStoreTX, Quartz";
properties["quartz.jobStore.useProperties"] = "true";
properties["quartz.jobStore.dataSource"] = "default";
properties["quartz.jobStore.tablePrefix"] = "QRTZ_";
// if running MS SQL Server we need this
properties["quartz.jobStore.lockHandler.type"] = "Quartz.Impl.AdoJobStore.UpdateLockRowSemaphore, Quartz";
properties["quartz.dataSource.default.connectionString"] = "Server=.\\SQLExpress;Database=test;Trusted_Connection=True;";
properties["quartz.dataSource.default.provider"] = "SqlServer-20";
// StdSchedulerFactory
this.Initialize(properties);
运行应用程序时获取错误消息:
Quartz.dll中出现“Quartz.ObjectAlreadyExistsException”类型的第一次机会异常 Quartz.dll中发生了'Quartz.JobPersistenceException'类型的第一次机会异常 Quartz.dll
中出现“Quartz.JobPersistenceException”类型的第一次机会异常查看QRTZ_表时,QRTZ_JOB_DETAILS的作业中有一个帖子。其他表格是空的。
有什么想法可以解决问题吗?
更新
public class UnitySchedulerFactory : StdSchedulerFactory
{
private readonly UnityJobFactory unityJobFactory;
public UnitySchedulerFactory(UnityJobFactory unityJobFactory)
{
NameValueCollection properties = new NameValueCollection();
properties["quartz.scheduler.instanceName"] = "TestScheduler";
properties["quartz.scheduler.instanceId"] = "instance_one";
properties["quartz.jobStore.type"] = "Quartz.Impl.AdoJobStore.JobStoreTX, Quartz";
properties["quartz.jobStore.useProperties"] = "true";
properties["quartz.jobStore.dataSource"] = "default";
properties["quartz.jobStore.tablePrefix"] = "QRTZ_";
// if running MS SQL Server we need this
properties["quartz.jobStore.lockHandler.type"] = "Quartz.Impl.AdoJobStore.UpdateLockRowSemaphore, Quartz";
properties["quartz.dataSource.default.connectionString"] = "Server=.\\SQLExpress;Database=189021;Trusted_Connection=True;";
properties["quartz.dataSource.default.provider"] = "SqlServer-20";
this.Initialize(properties);
this.unityJobFactory = unityJobFactory;
}
protected override IScheduler Instantiate(QuartzSchedulerResources rsrcs, QuartzScheduler qs)
{
qs.JobFactory = this.unityJobFactory;
return base.Instantiate(rsrcs, qs);
}
}
Global.asax中
var scheduler = unityContainer.Resolve<IQuartzScheduler>();
scheduler.Run();
更新2
这是整个石英解决方案的链接:
Quartz表由以下内容创建:
https://github.com/MassTransit/MassTransit-Quartz/blob/master/setup_sql_server.sql
的Global.asax:
var unityContainer = Infrastructure.Bootstrapper.Initialise();
var scheduler = unityContainer.Resolve<IQuartzScheduler>();
scheduler.Run();
我正在尝试做的是处理与ADOstore的失误,以便系统可以重启或崩溃。
答案 0 :(得分:1)
如果您在数据库中持续工作(就像您一样),则无法始终创建它们 您必须检查它们是否存在于启动时。
查看我的回答here了解更多详情。
初始化 Quartz.Net 并且您正在使用 AdoJobStore 时,调度程序将获取数据库中保存的所有作业/触发器。
在IQuartzScheduler.Run()
中,您应该检查作业是否存在:
this.Scheduler.GetJobDetail()
您可以使用这段代码来测试它是否有效:
IJobDetail helloJob = null;
ITrigger helloTrigger = null;
helloJob = this.Scheduler.GetJobDetail(new JobKey("HelloJob", "MyGroup"));
if (helloJob == null)
{
helloJob = JobBuilder.Create<Jobs.HelloJob>()
.WithIdentity("HelloJob", "MyGroup")
.RequestRecovery(true)
// .StoreDurably(true)
.Build();
helloTrigger = TriggerBuilder.Create()
.WithIdentity("HelloTrigger", "MyGroup")
.StartNow()
.WithSimpleSchedule(x => x.RepeatForever().WithIntervalInSeconds(20))
.Build();
this.Scheduler.ScheduleJob(helloJob, helloTrigger);
}
this.Scheduler.Start();
如果您使用的是最新的Quartz.Net版本,则数据库创建脚本似乎存在问题。
我注意到触发器没有触发。然后,我使用GitHub上的Quartz.Net存储库中的最新脚本创建了数据库,并且它可以正常工作。
同时检查此answer。关于 Quartz.Net + AdoJobStore 的更多细节。