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 – LinkBut??ton不会在click()上调用
- ASP NET CORE – ANGULAR NO’Access-Control-Allow-Origin
- asp.net-mvc – 从子页面选择MVC中母版页上的右侧菜单
- .NET内存泄漏
- asp.net-mvc – 如何确定视图是否为ASP.NET MVC中的GET或PO
- .net – 参考WCF最佳实践项目
- asp.net-mvc-2 – 处理DDD风格的ASP.Net MVC2 Web应用程序中
- asp.net-mvc – 如何在特定的mvc3控制器/动作中授权用户角色
- asp.net-mvc-3 – ASP.NET MVC 3 WebGrid – 条件列格式
- ASP.NET 2.0到4.0
- 会话处理在asp.net
- asp.net-mvc – 从ModelMetaData获取另一个属性的
- asp.net – 使用Visual Studio 2015检测gulp中的
- asp.net-mvc – ASP.NET MVC Session vs Global
- asp.net-mvc – 如何在asp.net mvc中处理分页?
- Favicon只在主页ASP.NET MVC中显示
- asp.net-mvc – MVC动作过滤器集合已修改;枚举操
- 在asp.net中排序gridview的列c#
- asp.net-mvc – 密码保护整个.net mvc应用程序?
- asp.net-mvc-4 – 如何永久教Visual Studio检测我