使用ADOStore运行作业时出现Quartz.net错误

时间:2014-03-12 19:06:20

标签: quartz-scheduler quartz.net

我在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

这是整个石英解决方案的链接:

http://1drv.ms/1o0rpg8

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的失误,以便系统可以重启或崩溃。

1 个答案:

答案 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 的更多细节。