在IJob接口的Execute()方法的执行之间保持数据

时间:2013-12-31 09:31:36

标签: c# asp.net-mvc-4 session quartz.net

我正在研究asp.net MVC 4项目。我写了一个名为“AppStartPushNotificationJob”的作业,并在Global.asax.cs的Application_Start()方法中安排了它。

protected void Application_Start() {

   ..............................

   IScheduler scheduler = new StdSchedulerFactory().GetScheduler();
   var jobDetail = new JobDetail("AppPushNotification", null,
                                     typeof (AppStartPushNotificationJob));
   Trigger trigger = TriggerUtils.MakeMinutelyTrigger(5);
   trigger.Name = jobDetail.Name;
   scheduler.ScheduleJob(jobDetail, trigger);
   scheduler.Start();
}

我想在会话中放入一些数据,并且每次在AppStartPushNotificationJob的Execute()方法中访问它。我不能使用HttpContext.Current.Session来存储会话数据,因为在Execute()方法中HttpContext.Current为null。

关于如何在连续调用Execute()方法之间实现会话类型的任何想法?

2 个答案:

答案 0 :(得分:1)

  

关于如何实现会话类型的任何想法   在连续调用Execute()方法之间?

您可以使用“应用程序”状态。请记住,它是在所有用户之间共享的,因此您可能需要key中对当前用户而言唯一的内容:

application["prefix::key"] = "some value";

在此示例中,application实例表示当您在Application_Start方法中启动时应传递给后台线程的当前ASP.NET应用程序实例(HttpApplicationState)。基本上,这将是当前实例(this)。

在将此解决方案部署到生产系统之前,请确保您已阅读有关The Dangers of Implementing Recurring Background Tasks In ASP.NET的内容。这可能会让你意识到在ASP.NET应用程序中做这样的事情是多么糟糕。

答案 1 :(得分:1)

您可以通过使用JobDataMap作业在作业调用之间保持状态,有关详细信息,请参阅教程:

http://www.quartz-scheduler.net/documentation/quartz-1.x/tutorial/more-about-jobs.html

我已经链接到1.x教程,因为您似乎正在使用1.x API。如果可能的话,我强烈建议更新到2.x系列。

如前所述,如果您没有使用持久性作业存储(IIS工作进程在不活动时进行回收或以其他方式安排),则会出现丢失状态的警告。使用AdoJobStore,您可以安全地在执行之间保留数据。虽然如果工作人员已被停用,则无法保证调度程序正在运行。