我正在研究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()方法之间实现会话类型的任何想法?
答案 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,您可以安全地在执行之间保留数据。虽然如果工作人员已被停用,则无法保证调度程序正在运行。