zoukankan      html  css  js  c++  java
  • Spring.NET教程(二十)——整合Quartz.NET(应用篇)

    Quartz.NET是一个开源的作业调度框架,是OpenSymphony 的 Quartz API的.NET移植,它用C#写成,可用于WinForm和ASP.NET应用中。它提供了巨大的灵活性而不牺牲简单性。你能够用它来为执行一个作业而创建简单的或复杂的调度。它有很多特征,如:数据库支持,集群,插件,支持cron-like表达式等等。

    你曾经需要应用执行一个任务吗?这个任务每天或每周星期二晚上11:30,或许仅仅每个月的最后一天执行。一个自动执行而无须干预的任务在执行过程中如果发生一个严重错误,应用能够知到其执行失败并尝试重新执行吗?你和你的团队是用.NET编程吗?如果这些问题中任何一个你回答是,那么你应该使用Quartz.NET调度器。 Quartz.NET允许开发人员根据时间间隔(或天)来调度作业。它实现了作业和触发器的多对多关系,还能把多个作业与不同的触发器关联。整合了 Quartz.NET的应用程序可以重用来自不同事件的作业,还可以为一个事件组合多个作业。

      Quartz.NET使用Trigger,Job和JobDetail对象的组合来实现工作调度,可以参考博客:http://www.cnblogs.com/shanyou/archive/2007/08/25/QuartzNETtutorial.html 

      Spring.NET现在已经支持了Quartz.NET,在以后的开发中我们仅需要配置一下属性就能轻松使用Quartz.NET。

      Spring.NET提供了QuartzJobObject基类,该类继承IJob接口。实现一个Job我们可以继承该类。或者配置Spring.NET提供的MethodInvokingJobDetailFactoryObject对象。而实现JobDetail则使用Spring.NET提供的JobDetailObject类。另外Spring.NET为我们提供了两种Trigger:Spring.Scheduling.Quartz.SimpleTriggerObject和Spring.Scheduling.Quartz.CronTriggerObject。

      以下是两种Trigger的例子:

      DiningService

        public class DiningService : QuartzJobObject
        {
            public string UserName { get; set; }
            protected override void ExecuteInternal(JobExecutionContext context)
            {
                string msg = string.Format("{0}: 回家吃饭时间, 姓名: {1}, 下次吃饭时间 {2}",
                    DateTime.Now, UserName,
                    context.NextFireTimeUtc.Value.ToLocalTime());
                Console.WriteLine(msg);
            }
        }

    DiningService

          <object name="DiningService" type="Spring.Scheduling.Quartz.JobDetailObject, Spring.Scheduling.Quartz">
            <property name="JobType" value="QuartzNet.DiningService, QuartzNet" />
            <!-- 注入被调度的对象 -->
            <property name="JobDataAsMap">
              <dictionary>
                <entry key="UserName" value="冬冬" />
              </dictionary>
            </property>
          </object>
          <object id="cronTrigger" type="Spring.Scheduling.Quartz.CronTriggerObject, Spring.Scheduling.Quartz">
            <property name="jobDetail" ref="DiningService" />
            <!-- 每个5秒执行一次 -->
            <property name="cronExpressionString" value="0/5 * * * * ?" />
          </object>

      PersonService

        public class PersonService
        {
            public string UserName { get; set; }
            public void GoToBed()
            {
                Console.WriteLine("姓名 {0} 睡觉的时间是: {1}", UserName, DateTime.Now);
            }
        }

      PersonService

          <!--注入的目标对象-->
          <object id="PersonService" type="QuartzNet.PersonService, QuartzNet">
            <property name="UserName" value="刘冬" />
          </object>
          <object id="jobDetail" type="Spring.Scheduling.Quartz.MethodInvokingJobDetailFactoryObject, Spring.Scheduling.Quartz">
            <!-- 不必继承IJob接口 -->
            <property name="TargetObject" ref="PersonService" />
            <property name="TargetMethod" value="GoToBed" />
          </object>
          <object id="jobDetailNonConcurrent" type="Spring.Scheduling.Quartz.MethodInvokingJobDetailFactoryObject, Spring.Scheduling.Quartz">
            <property name="targetObject" ref="PersonService" />
            <property name="targetMethod" value="GoToBed" />
            <!-- 并发等待 -->
            <property name="concurrent" value="false" />
          </object>
          <object id="simpleTrigger" type="Spring.Scheduling.Quartz.SimpleTriggerObject, Spring.Scheduling.Quartz">
            <property name="jobDetail" ref="jobDetail" />
            <!-- 从几秒开始 -->
            <property name="startDelay" value="0s" />
            <!-- 每隔5秒重复 -->
            <property name="repeatInterval" value="15s" />
          </object>

      triggers

          <object type="Spring.Scheduling.Quartz.SchedulerFactoryObject, Spring.Scheduling.Quartz">
            <!--触发器-->
            <property name="triggers">
              <list>
                <ref object="simpleTrigger" />
                <ref object="cronTrigger" />
              </list>
            </property>
          </object>

      运行效果:

    Spring.NET教程(二十二)——整合Quartz.NET(应用篇) Level 200

  • 相关阅读:
    swagger2 Could not resolve pointer: /definitions
    mybatis-plus使用Oracle函数生成主键
    WebLogic安装及部署
    windows下用bat启动jar包,修改cmd标题(title)
    Windows下修改Tomcat黑窗口标题
    jar包注册为Linux服务
    Redis我想入门——数据类型
    Redis我想入门——启动
    JAVA8给我带了什么——Optional和CompletableFuture
    JAVA8给我带了什么——并行流和接口新功能
  • 原文地址:https://www.cnblogs.com/millen/p/1635993.html
Copyright © 2011-2022 走看看