asp.net – Quartz.net调度程序在部署后不会触发作业/触发器
|
介绍 我在ASP.Net框架4,webforms网站上使用Quartz.Net. (注意:我知道有些人会建议使用Quartz作为Windows服务,但是尽管有这样做的好处,我真的想知道为什么它不能用作嵌入式解决方案,因为它应该工作得很好喜欢本地) 细节 Quartz 2.1.2 Common.Logging 2.1.2 Common.Logging.NLog 2.0.0 NLog 2.0.1.2 Global.asax中 public static ISchedulerFactory SchedulerFactory;
public static IScheduler Scheduler;
void Application_Start(object sender,EventArgs e)
{
SchedulerFactory = new StdSchedulerFactory();
Scheduler = SchedulerFactory.GetScheduler();
// Define a durable job instance (durable jobs can exist without triggers)
IJobDetail job = JobBuilder.Create<MyJobClass>()
.WithIdentity("MyJob","MyGroup")
.StoreDurably()
.Build();
Scheduler.AddJob(job,false);
Scheduler.Start();
}
void Application_End(object sender,EventArgs e)
{
Scheduler.Shutdown(true);
}
process.aspx.cs(单击开始按钮) // get records from DB,iterate,process,etc
...
IJobDetail job = ASP.global_asax.Scheduler.GetJobDetail(new JobKey("MyJob","MyGroup"));
job.JobDataMap.Put("something1",1);
job.JobDataMap.Put("something2",somevar);
ITrigger trigger = TriggerBuilder.Create()
.WithIdentity("MyTrigger","MyGroup")
.StartNow()
.WithSimpleSchedule(x => x.WithIntervalInSeconds(5).RepeatForever())
.Build();
var triggersSet = new Quartz.Collection.HashSet<ITrigger> { trigger };
ASP.global_asax.Scheduler.ScheduleJob(job,triggersSet,true);
日志输出 本地日志 Default Quartz.NET properties loaded from embedded resource file Using default implementation for object serializer Using default implementation for ThreadExecutor Initialized Scheduler Signaller of type: Quartz.Core.SchedulerSignalerImpl Quartz Scheduler v.2.1.2.400 created. RAMJobStore initialized. Scheduler meta-data: Quartz Scheduler (v2.1.2.400) 'DefaultQuartzScheduler' with instanceId 'NON_CLUSTERED' Scheduler class: 'Quartz.Core.QuartzScheduler' - running locally. NOT STARTED. Currently in standby mode. Number of jobs executed: 0 Using thread pool 'Quartz.Simpl.SimpleThreadPool' - with 10 threads. Using job-store 'Quartz.Simpl.RAMJobStore' - which does not support persistence. and is not clustered. Quartz scheduler 'DefaultQuartzScheduler' initialized Quartz scheduler version: 2.1.2.400 Scheduler DefaultQuartzScheduler_$_NON_CLUSTERED started. Batch acquisition of 0 triggers Batch acquisition of 0 triggers 它继续记录0次触发的批量采集,直到发生按钮点击: Default Quartz.NET properties loaded from embedded resource file Batch acquisition of 1 triggers Producing instance of Job 'MyGroup.MyJob',class=MyJobClass Batch acquisition of 0 triggers Calling Execute on job MyGroup.MyJob Trigger instruction : NoInstruction Batch acquisition of 1 triggers Producing instance of Job 'MyGroup.MyJob',class=MyJobClass Batch acquisition of 0 triggers Calling Execute on job MyGroup.MyJob Trigger instruction : NoInstruction Batch acquisition of 1 triggers 部署日志 Default Quartz.NET properties loaded from embedded resource file Using default implementation for object serializer Using default implementation for ThreadExecutor Initialized Scheduler Signaller of type: Quartz.Core.SchedulerSignalerImpl Quartz Scheduler v.2.1.2.400 created. RAMJobStore initialized. Scheduler meta-data: Quartz Scheduler (v2.1.2.400) 'DefaultQuartzScheduler' with instanceId 'NON_CLUSTERED' Scheduler class: 'Quartz.Core.QuartzScheduler' - running locally. NOT STARTED. Currently in standby mode. Number of jobs executed: 0 Using thread pool 'Quartz.Simpl.SimpleThreadPool' - with 10 threads. Using job-store 'Quartz.Simpl.RAMJobStore' - which does not support persistence. and is not clustered. Quartz scheduler 'DefaultQuartzScheduler' initialized Quartz scheduler version: 2.1.2.400 Scheduler DefaultQuartzScheduler_$_NON_CLUSTERED started. 在这里保持这样.如您所见,与其他日志相比,它并没有尝试获取触发器(线路批量获取0触发器根本不会出现).如果您仍然单击进程按钮,则日志会添加一行: Default Quartz.NET properties loaded from embedded resource file 但没有别的事情发生.记录未被处理(我知道,因为每次记录被处理,都会在数据库中标记).不会发生错误,但不会触发触发器,也不会执行作业.此外,按钮单击时CPU使用率最多可达50%或更多,除非您转到IIS,停止并重新启动应用程序池,否则不会下降.此cpu消耗不会在本地发生. 更新1 根据LeftyX的建议,更改了对单例的调度程序的使用,但仍然在远程服务器上获得相同的行为. 更新2 我也尝试使用ADOJobStore(而不是我正在使用的RAMJobStore). 解决方法我注意到的一件事是在asp.net应用程序中使用Scheduler.你应该使用单例对象. 在你的process.aspx.cs这一行 IScheduler scheduler = new StdSchedulerFactory().GetScheduler(); 创建一个新的调度程序,但您应该在Application_Start中使用您创建的静态调度程序. 如果要访问单例实例,请在Global.asax.cs中使用公共memeber: public static ISchedulerFactory SchedulerFactory; public static IScheduler Scheduler; 你可以在process.aspx.cs中引用它: MvcApplication.Scheduler.ScheduleJob(job,true); 另一种解决方案是使用依赖注入.您可以使用StructureMap找到一些信息here,为Unity找到here. 更新: 您可以下载名为AspNet_Quartz here的示例应用程序(asp.net 4.0),看看它是如何工作的here. (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- ASP.NET页面上的多种语言(英语,法语)
- asp.net – 在web.config文件中设置重定向
- asp.net – 为什么我不能从Visual Studio 2005安装IE8后调试
- 使用ASP.NET共享托管的十大陷阱
- asp.net-mvc – 如何传递列表从控制器到MVC 3中查看
- 如何阻止.Net HttpWebRequest.GetResponse()引发异常
- asp.net – 拥有专用应用程序池,将Web应用程序保留在一个默
- asp.net-mvc – 当我用fiddler检查时,VS2013 RTM每秒发出一
- asp.net-mvc – 在部分视图中传递参数 – MVC3 / Razor
- asp.net – 由于其保护级别,未声明变量可能无法访问
- asp.net-mvc-3 – MVC绑定到带有列表属性的模型忽
- asp.net-mvc-2 – 在选择聚合时,如何处理Linq到N
- asp.net – 在实体框架中使用PersianCalendar作为
- ASP.NET webform的Bootstrap
- Asp.net下使用Jquery Ajax传送和接收DataTable的
- webservice的两种调用方式
- asp.net-mvc – AspNet如何与我的模型识别
- ASP.NET MVC与WebForms:速度和架构比较
- asp.net – 在Web.config帮助中定义tagPrefixes
- asp.net-mvc – 如何为ASP.NET MVC区域捆绑资源?
