Quartz.net in WCF
本文关键字:WCF in net Quartz | 更新日期: 2023-09-27 18:37:05
我有一项服务:
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
public class PremieraInteraction : ServiceInit, IPremieraInteraction
{
public PremieraInteraction()
{
ISchedulerFactory schedFact = new StdSchedulerFactory();
// get a scheduler
IScheduler sched = schedFact.GetScheduler();
sched.Start();
// construct job info
IJobDetail jobDetail = JobBuilder.Create<PremieraUpdate>().WithIdentity("PremieraUpdateJob").Build();
ITrigger trigger =
TriggerBuilder.Create().WithIdentity("PremieraUpdateTrigger").StartNow().WithSimpleSchedule(
x => x.WithIntervalInSeconds(10)).Build();
sched.ScheduleJob(jobDetail, trigger);
}
}
这是工作:
public class PremieraUpdate:IJob
{
public void Execute(IJobExecutionContext context)
{
Debug.WriteLine("Fire");
}
}
问题是它只工作一次。为什么调度程序不每 10 秒重复一次?
我建议您在Global.asax.cs
Application_Start
事件中实例化工厂和调度程序,并将它们存储在静态公共属性中。
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();
}
}
现在,在服务中,您可以通过 Global
属性访问调度程序。
前任。
Global.Scheduler
我希望您使用 WCF 服务将新作业安排到通常在 Windows 服务中运行的 Quartz 服务器。无需在构造函数中调度作业,您可以使用一种方法来获取作业的详细信息,并最终调度并运行它。
如果使用此实现,则无需将服务标记为单一实例。
一旦服务完成操作,调度程序很可能被垃圾回收。这是预期的,因为除了服务之外,您没有任何引用调度程序的内容。
通常,每个调用创建的 WCF 服务。这意味着每次调用服务都会创建一个服务的新实例。在大多数情况下,这很好,因为它有助于避免并发问题,但也可能会令人困惑。
在您的情况下,您需要对调度程序的持久引用。有很多方法可以做到这一点,从服务上的静态变量到某种知道所有调度程序及其生命周期的调度程序存储库。这取决于您的使用情况。
只是为了进行测试,您可以向服务类添加一个静态字段。 在服务调用中对此进行实例化,计划程序应根据需要每 10 秒调用一次操作。
但这也取决于您托管服务的位置(Web servce、服务、控制台应用程序?