【问题标题】:Quartz.net error when running job with ADOStore使用 ADOStore 运行作业时出现 Quartz.net 错误
【发布时间】:2014-03-12 19:06:20
【问题描述】:

我在 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);
    }
}

全球.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

全球.asax:

var unityContainer = Infrastructure.Bootstrapper.Initialise();

var scheduler = unityContainer.Resolve<IQuartzScheduler>();
scheduler.Run(); 

我正在尝试使用 ADOstore 处理失火问题,以便系统可以处理重启或崩溃。

【问题讨论】:

  • 你在哪里初始化 Quartz?
  • 已更新问题
  • 你是这个意思吗?
  • 您需要向我们提供更多信息。能否请您将您的解决方案上传到某个地方,以便我们查看?干杯。
  • 好的。问题再次更新。

标签: quartz-scheduler quartz.net


【解决方案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 存储库中的最新脚本创建了数据库,它可以正常工作。

也请检查此answerQuartz.Net + AdoJobStore 上的更多细节。

【讨论】:

  • 谢谢!这是接缝工作。有一件事我不明白。当一项作业在按预期触发或使用 misfire 指令触发时以太运行时,如何才能看到该作业实际运行?
  • 最好的选择是配置 Common.Logging 和/或查询表。 QRTZ_SIMPLE_TRIGGERS 表(用于简单触发器)为您提供触发器触发的次数。无论如何,我会选择日志。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-20
  • 2019-12-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多