gpt4 book ai didi

c# - Quartz.net JobStoreTX 作业保存问题

转载 作者:太空宇宙 更新时间:2023-11-03 11:02:56 43 4
gpt4 key购买 nike

我正在尝试为我的网站维护任务运行 Quartz.net 服务器。我在我的 WCF 应用程序(托管在 IIS 上)中创建作业和触发器。因此它们可以存储在数据库(SQL Server)中。

现在我无法理解 ADO.NET Job Store。这是我的 Quartz.net 的 web.config 部分:

<configSections>
<section name="quartz" type="System.Configuration.NameValueSectionHandler" />
</configSections>
<quartz>
<add key="quartz.threadPool.type" value="Quartz.Simpl.SimpleThreadPool, Quartz" />
<add key="quartz.threadPool.threadCount" value="10" />
<add key="quartz.threadPool.threadPriority" value="Normal" />
<add key="quartz.jobStore.misfireThreshold" value="60000" />
<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.tablePrefix" value="QRTZ_" />
<add key="quartz.jobStore.dataSource" value="ConnectionString" />
<add key="quartz.dataSource.ConnectionString.connectionString" value="Server=*;Database=*;Uid=*;Pwd=*" />
<add key="quartz.dataSource.ConnectionString.provider" value="SqlServer-20" />
<add key="quartz.scheduler.instanceName" value="PaymentService" />

<add key="quartz.jobStore.useProperties" value="true" />
</quartz>

这是我的 global.asax:

public class Global : System.Web.HttpApplication
{
public static ISchedulerFactory Factory;
public static IScheduler Scheduler;

protected void Application_Start(Object sender, EventArgs e)
{
Factory = new StdSchedulerFactory();
Scheduler = Factory.GetScheduler();

JobKey JobKey = new JobKey("GetOrderInfoJob", "Project");
if (Scheduler.CheckExists(JobKey))
Scheduler.DeleteJob(JobKey);

IJobDetail job = JobBuilder.Create<PaymentServiceLogic>()
.WithIdentity(JobKey)
.StoreDurably()
.RequestRecovery()
.Build();

TriggerKey triggerKey = new TriggerKey("GetOrderInfoTrigger", "Project");

TriggerBuilder tb = TriggerBuilder.Create();
tb.WithIdentity(triggerKey );
tb.WithSimpleSchedule(a => a.WithIntervalInMinutes(1));
tb.StartNow();
tb.ForJob(job);
ITrigger trigger = tb.Build();
Scheduler.ScheduleJob(trigger);

Scheduler.Start();
}
}

一旦我在本地主机上启动了 WCF 服务,SQL Server 中用于作业的 QRTZ_JOB_DETAILS 表就有 1 个条目,但没有触发器。我已经测试了这段代码几次,现在没有作业正在存储,因此我有这个异常(exception):无法存储触发器作业:触发器引用的作业不存在。

作业的构建或 AdoJobStore 是否存在一些错误?

第二个问题是关于如何在 global.asax 中正确关闭。现在我决定采用这种方法:

protected void Application_End(object sender, EventArgs e)
{
ICollection<IScheduler> all = Factory.AllSchedulers;
foreach (IScheduler item in all)
{
item.Shutdown(true);
}
}

并在 Application_Error 中实现我自己的日志记录。

最佳答案

请注意,确定将两个问题合二为一是否是个好主意,但第一个问题的答案是您需要更改

Scheduler.ScheduleJob(trigger);

Scheduler.ScheduleJob(job, trigger);

前者是作业先前已添加到调度程序,而后者是同时添加作业和触发器。

关于c# - Quartz.net JobStoreTX 作业保存问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17026143/

43 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com