• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >ASP.NET > 详解免费开源的DotNet任务调度组件Quartz.NET(.NET组件介绍之五)

详解免费开源的DotNet任务调度组件Quartz.NET(.NET组件介绍之五)

作者:彭泽0902 字体:[增加 减小] 来源:互联网 时间:2017-05-11

彭泽0902通过本文主要向大家介绍了dotnet,dotnet4.0,dotnet framework 4.0,dotnet2.0,dotnetframework等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

很多的软件项目中都会使用到定时任务、定时轮询数据库同步,定时邮件通知等功能。.NET Framework具有“内置”定时器功能,通过System.Timers.Timer类。在使用Timer类需要面对的问题:计时器没有持久化机制;计时器具有不灵活的计划(仅能设置开始时间和重复间隔,没有基于日期,时间等);计时器不使用线程池(每个定时器一个线程);计时器没有真正的管理方案 - 你必须编写自己的机制,以便能够记住,组织和检索任务的名称等。

如果需要在.NET实现定时器的功能,可以尝试使用以下这款开源免费的组件Quartz.Net组件。目前Quartz.NET版本为3.0,修改了原来的一些问题:修复由于线程本地存储而不能与AdoJobStore协同工作的调度器信令;线程局部状态完全删除;quartz.serializer.type是必需的,即使非序列化RAMJobStore正在使用;JSON序列化错误地称为序列化回调。

一.Quart.NET概述: 

Quartz是一个作业调度系统,可以与任何其他软件系统集成或一起使用。作业调度程序是一个系统,负责在执行预处理程序时执行(或通知)其他软件组件 - 确定(调度)时间到达。Quartz是非常灵活的,并且包含多个使用范例,可以单独使用或一起使用,以实现您所需的行为,并使您能够以您的项目看起来最“自然”的方式编写代码。组件的使用非常轻便,并且需要非常少的设置/配置 - 如果您的需求相对基础,它实际上可以使用“开箱即用”。Quartz是容错的,并且可以在系统重新启动之间保留(记住)您的预定作业。尽管Quartz对于在给定的时间表上简单地运行某些系统进程非常有用,但当您学习如何使用Quartz来驱动应用程序的业务流程时,Quartz的全部潜能可以实现。

 Quartz是作为一个小的动态链接库(.dll文件)分发的,它包含所有的核心Quartz功能。 此功能的主要接口(API)是调度程序接口。 它提供简单的操作,如调度/非调度作业,启动/停止/暂停调度程序。如果你想安排你自己的软件组件执行,他们必须实现简单的Job接口,它包含方法execute()。 如果希望在计划的触发时间到达时通知组件,则组件应实现TriggerListener或JobListener接口。主要的Quartz'进程'可以在您自己的应用程序或独立应用程序(使用远程接口)中启动和运行。

二.Quartz.NET主体类和方法解析:

1.StdSchedulerFactory类:创建QuartzScheduler实例。

  /// <summary>
    /// 返回此工厂生成的调度程序的句柄。
    /// </summary>
    /// <remarks>
    ///如果<see cref =“Initialize()”/>方法之一没有先前调用,然后是默认(no-arg)<see cref =“Initialize()”/>方法将被这个方法调用。
    /// </remarks>
    public virtual IScheduler GetScheduler()
    {
      if (cfg == null)
      {
        Initialize();
      }

      SchedulerRepository schedRep = SchedulerRepository.Instance;

      IScheduler sched = schedRep.Lookup(SchedulerName);

      if (sched != null)
      {
        if (sched.IsShutdown)
        {
          schedRep.Remove(SchedulerName);
        }
        else
        {
          return sched;
        }
      }

      sched = Instantiate();

      return sched;
    }
</div>
public interface ISchedulerFactory
  {
    /// <summary>
    /// Returns handles to all known Schedulers (made by any SchedulerFactory
    /// within this app domain.).
    /// </summary>
    ICollection<IScheduler> AllSchedulers { get; }

    /// <summary>
    /// Returns a client-usable handle to a <see cref="IScheduler" />.
    /// </summary>
    IScheduler GetScheduler();

    /// <summary>
    /// Returns a handle to the Scheduler with the given name, if it exists.
    /// </summary>
    IScheduler GetScheduler(string schedName);
  }
</div>

2.JobDetailImpl:传递给定作业实例的详细信息属性。

/// <summary>
    /// 获取或设置与<see cref =“IJob”/>相关联的<see cref =“JobDataMap”/>。
    /// </summary>
    public virtual JobDataMap JobDataMap
    {
      get
      {
        if (jobDataMap == null)
        {
          jobDataMap = new JobDataMap();
        }
        return jobDataMap;
      }

      set { jobDataMap = value; }
    }

</div>

3.JobKey:键由名称和组组成,名称必须是唯一的,在组内。 如果只指定一个组,则默认组将使用名称。

  [Serializable]
  public sealed class JobKey : Key<JobKey>
  {
    public JobKey(string name) : base(name, null)
    {
    }

    public JobKey(string name, string group) : base(name, group)
    {
    }

    public static JobKey Create(string name)
    {
      return new JobKey(name, null);
    }

    public static JobKey Create(string name, string group)
    {
      return new JobKey(name, group);
    }
  }

</div>

4.StdSchedulerFactory.Initialize():

/// <summary> 
    /// 使用初始化<see cref =“ISchedulerFactory”/>
     ///给定键值集合对象的内容。
    /// </summary>
    public virtual void Initialize(NameValueCollection props)
    {
      cfg = new PropertiesParser(props);
      ValidateConfiguration();
    }

    protected virtual void ValidateConfiguration()
    {
      if (!cfg.GetBooleanProperty(PropertyCheckConfiguration, true))
      {
        // should not validate
        return;
      }

      // determine currently supported configuration keys via reflection
      List<string> supportedKeys = new List<string>();
      List<FieldInfo> fields = new List<FieldInfo>(GetType().GetFields(BindingFlags.Static | BindingFlags.Public | BindingFlags.FlattenHierarchy));
      // choose constant string fields
      fields = fields.FindAll(field => field.FieldType == typeof (string));

      // read value from each field
      foreach (FieldInfo field in fields)
      {
        string value = (string) field.GetValue(null);
        if (value != null && value.StartsWith(ConfigurationKeyPrefix) && value != ConfigurationKeyPrefix)
        {
          supportedKeys.Add(value);
        }
      }

      // now check against allowed
      foreach (string configurationKey in cfg.UnderlyingProperties.AllKeys)
      {
        if (!configurationKey.StartsWith(ConfigurationKeyPrefix) || configurationKey.StartsWith(ConfigurationKeyPrefixServer))
        {
          // don't bother if truly unknown property
          continue;
        }

        bool isMatch = false;
        foreach (string supportedKey in supportedKeys)
        {
          if (configurationKey.StartsWith(supportedKey, StringComparison.InvariantCulture))
          {
            isMatch = true;
            break;
          }
        }
        if (!isMatch)
        {
          throw new SchedulerConfigException("Unknown configuration property '" + configurationKey + "'");
        }
      }

    }

</div>

三.Quartz.NET的基本应用:

 下面提供一些较为通用的任务处理代码:

1.任务处理帮助类:

 /// <summary>
  /// 任务处理帮助类
  /// </summary>
  public class QuartzHelper
  {
    public QuartzHelper() { }

    public QuartzHelper(string quartzServer, string quartzPort)
    {
      Server = quartzServer;
      Port = quartzPort;
    }

    /// <summary>
    /// 锁对象
    /// </summary>
    private static readonly object Obj = new object();

    /// <summary>
    /// 方案
    /// </summary>
    private const string Scheme = "tcp";

    /// <summary>
    /// 服务器的地址
    /// </summary>
    public static string Server { get; set; }

    /// <summary>
    /// 服务器的端口
    /// </summary>
    public static string Port { get; set; }

    /// <summary>
    /// 缓存任务所在程序集信息
    /// </summary>
    private static readonly Dictionary<string, Assembly> Assembly



 
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • Visual studio 2017如何发布dotnet core到docker
  • 详解免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)
  • 详解最好的.NET开源免费ZIP库DotNetZip(.NET组件介绍之三)
  • 详解免费开源的DotNet任务调度组件Quartz.NET(.NET组件介绍之五)
  • .Net Core自动化部署之利用docker版jenkins部署dotnetcore应用的方法
  • CKEditor与dotnetcore实现图片上传功能
  • dotnet封装的kindeditor编辑器控件
  • DotNet2.0 生成网站的测试

相关文章

  • 2017-05-11有潜在危险的 Request.Form 值避免方法
  • 2017-05-11Asp.net下载功能的解决方案代码
  • 2017-05-11asp.net中GridView控件遍历的小例子
  • 2017-05-11ASP.NET过滤HTML标签只保留换行与空格的方法
  • 2017-05-11c#网站WebConfig中域名引用示例介绍
  • 2017-05-11asp.net中Request.QueryString与Request.Param的区别分析
  • 2017-05-11asp.net页面与页面之间传参数值方法(post传值和get传值)
  • 2017-05-11ASP.NET在IIS7中上下文中不可用的解决方法
  • 2018-08-20.Net WebApi消息拦截器之MessageHandler的示例
  • 2017-05-11URLRewriter最简单入门介绍 URLRewriter相关资源

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • ajaxControlToolkit中CascadingDropDown的用法说明
    • C#使用正则表达式实例
    • 详解ASP.NET与ASP.NET Core用户验证Cookie并存解决方案
    • 在ASP.NET 2.0中操作数据之五:声明参数
    • ASP.Net全局变量的设置和读取方法
    • asp.net Bundle功能扩展
    • asp.net中的GridView分页问题
    • 利用Dom操作字符串一例
    • Repeater控件分别绑定数组和ArrayList实现思路
    • ASP.net WebAPI跨域调用问题的解决方法

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有