项目慢慢就要开工了,很多园友都在问这个事情,看来大伙对这事很上心啊,事情需要一步步的来,尽量写出一个我们都满意的项目。以前每次在博客前面都会扯淡一下,不过很多人都抱怨这样做不好,加上我这人扯淡起来就停不住,有时候还会很感性的说出一些话,所以以后写博文尽量少扯淡。(如果博文有不足之处,还望多多指正,我也会及时的修改,如果只是单纯的刷存在感,说一些过激的话,那我就不怎么高兴了)

项目中很多时候都会使用到定时任务这样一个功能需求,在.NET中对于完成定时任务的技术还是不怎么多的,.NET Framework具有“内置”定时器功能,通过System.Timers.Timer类。在使用Timer类需要面对的问题:计时器没有持久化机制;计时器具有不灵活的计划(仅能设置开始时间和重复间隔,没有基于日期,时间等);计时器不使用线程池(每个定时器一个线程);计时器没有真正的管理方案 - 你必须编写自己的机制,以便能够记住,组织和检索任务的名称等。如果需要在.NET实现定时器的功能,可以尝试使用以下这款开源免费的组件Quartz.Net组件。

上面介绍了两种方式,在这里就介绍另外一种组件,那就是Hangfire组件。

一.Hangfire组件概述

在.NET和.NET Core应用程序中执行后台处理的简单方法。无需Windows服务或单独的进程。由持久存储支持,存储方式有sqlserver、redis,mongodb等等。Hangfire支持所有类型的后台任务 - 短时间运行和长时间运行,CPU密集型和I / O密集型,一次性和周期性。

   1.组件特点:

   2.组件功能:

上面是对Hangfire组件背景的一些简单介绍,下面我们具体来了解一下Hangfire组件的使用方法。

二.Hangfire组件使用方法介绍

既然想要学习了解一个组件,当然需要知道是怎么样取使用,如果不能使用,学着也没有什么很大的用处,下面介绍一下Hangfire组件的一些常用方法。

1.ASP.NET MVC设置方式:

public void Configuration(IAppBuilder app)
{
GlobalConfiguration.Configuration.UseSqlServerStorage("<connection string or its name>");
app.UseHangfireDashboard();
app.UseHangfireServer();
}

GlobalConfiguration类是配置Hangfire的首选方式。这是一些方法的入口点,包括来自第三方存储实现或其他扩展的方法。用法很简单,只需Hangfire在应用程序初始化类中包含命名空间,并发现GlobalConfiguration.Configuration属性的扩展方法

   2.控制台设置方式:

 GlobalConfiguration.Configuration
.UseColouredConsoleLogProvider()
          .UseSqlServerStorage(@"Server=.\sqlexpress;Database=Hangfire.Sample;Trusted_Connection=True;")
.UseMsmqQueues(@".\Private$\hangfire{0}", "default", "critical");

3.基于队列的任务处理:

var jobId = BackgroundJob.Enqueue(
() => Console.WriteLine("Fire-and-forget!"));

4.延迟任务执行:

var jobId = BackgroundJob.Schedule(
() => Console.WriteLine("Delayed!"),
TimeSpan.FromDays());

5.循环任务执行:

RecurringJob.AddOrUpdate(
() => Console.WriteLine("Recurring!"),
Cron.Daily);

6.继续在其父作业完成时执行:

BackgroundJob.ContinueWith(
jobId,
() => Console.WriteLine("Continuation!"));

7.批处理方法:

var batchId = BatchJob.StartNew(x =>
{
x.Enqueue(() => Console.WriteLine("Job 1"));
x.Enqueue(() => Console.WriteLine("Job 2"));
});

8.当父批次中的所有后台作业完成时,批处理继续:

BatchJob.ContinueWith(batchId, x =>
{
x.Enqueue(() => Console.WriteLine("Last Job"));
});

   9.使用IoC容器:

public  class  ContainerJobActivator  : JobActivator
{
private IContainer _container ;
public ContainerJobActivator (IContainer container )
{
_container = container ;
}}
public override object ActivateJob (Type type )
{
return _container 。Resolve (type );
}
}

在启动Hangfire服务器之前将其注册为当前作业启动器。

var container = new Container();
GlobalConfiguration.Configuration.UseActivator(new ContainerJobActivator(container));
...
app.UseHangfireServer();

Hangfire将作业保存到持久存储中,并以可靠的方式处理它们。这意味着你可以中止Hangfire工作线程,卸载应用程序域甚至终止进程,工作将被处理。Hangfire将作业标记为已完成,只有当代码的最后一行执行,并知道作业可能会失败,最后一行。它包含不同的自动重试功能,可以处理代码中的存储错误或错误。

三.Hangfire组件核心对象解析

上面介绍了Hangfire组件的常用方法,Hangfire组件的功能非常多,这里就做介绍了,有兴趣可以去官网进行查看api。下面介绍一下Hangfire组件的一些核心对象,初探Hangfire组件深层次的问题。

 1.RecurringJob.AddOrUpdate():

 public static void AddOrUpdate(
Expression<Action> methodCall,
string cronExpression,
TimeZoneInfo timeZone = null,
string queue = EnqueuedState.DefaultQueue)
{
var job = Job.FromExpression(methodCall);
var id = GetRecurringJobId(job); Instance.Value.AddOrUpdate(id, job, cronExpression, timeZone ?? TimeZoneInfo.Utc, queue);
}

该方法用于定期作业在指定的CRON计划上触发多次。该方法具有16个重载,Job.FromExpression(methodCall);用于获取基于Job类的新实例给定的方法调用的表达式树。GetRecurringJobId(job)方法根据Job对象获取对应的JobID。

2.BackgroundJob.Enqueue():

public static string Enqueue([NotNull, InstantHandle] Expression<Action> methodCall)
{
var client = ClientFactory();
return client.Enqueue(methodCall);
}

该方法基于给定的方法调用表达式创建一个新的fire-and-forget作业。该方法接受一个参数,表示将被编组到服务器的方法调用表达式。接下来我们看一下var client = ClientFactory();方法的具体实现

internal static Func<IBackgroundJobClient> ClientFactory
{
get
{
lock (ClientFactoryLock)
{
return _clientFactory ?? DefaultFactory;
}
}
set
{
lock (ClientFactoryLock)
{
_clientFactory = value;
}
}
}

该属性定义了一个Func<IBackgroundJobClient>的泛型委托。该属性是一个可读可写的操作,对ClientFactoryLock加锁,确保不发生死锁情况。

四.总结

上面简单的介绍了Hangfire组件的背景和一些简单的应用,也着重的介绍了一些对象。这个组件的功能很强大,需要了解的地方也较多,这一篇文章不可能全部介绍,用做抛砖引玉的作用。在这里吐槽一句,微软最近技术发展太快,很多技术还没有来得及发展,就有新的技术出来,让我们这些底层的人着实难受,事物发展有规律,不是以前缺的东西可以在很短的时间就可以补上,还是需要留下足够的空间。

开源的.NET定时任务组件Hangfire解析的更多相关文章

  1. NET定时任务组件Hangfire

    开源的.NET定时任务组件Hangfire解析 项目慢慢就要开工了,很多园友都在问这个事情,看来大伙对这事很上心啊,事情需要一步步的来,尽量写出一个我们都满意的项目.以前每次在博客前面都会扯淡一下,不 ...

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

    很多的软件项目中都会使用到定时任务.定时轮询数据库同步,定时邮件通知等功能..NET Framework具有“内置”定时器功能,通过System.Timers.Timer类.在使用Timer类需要面对 ...

  3. C#定时任务组件之FluentScheduler

    FluentScheduler是.NET开源处理定时任务组件 1.任务的创建注册 public static void TaskActionByMinutes(Action action, int c ...

  4. 【原创】开源.NET排列组合组件KwCombinatorics使用(三)——笛卡尔积组合

           本博客所有文章分类的总目录:本博客博文总目录-实时更新 本博客其他.NET开源项目文章目录:[目录]本博客其他.NET开源项目文章目录 KwCombinatorics组件文章目录: 1. ...

  5. 【原创】开源.NET排列组合组件KwCombinatorics使用(二)——排列生成

           本博客所有文章分类的总目录:本博客博文总目录-实时更新 本博客其他.NET开源项目文章目录:[目录]本博客其他.NET开源项目文章目录 KwCombinatorics组件文章目录: 1. ...

  6. 【原创】开源.NET排列组合组件KwCombinatorics使用(一)—组合生成

           本博客所有文章分类的总目录:本博客博文总目录-实时更新 本博客其他.NET开源项目文章目录:[目录]本博客其他.NET开源项目文章目录 KwCombinatorics组件文章目录: 1. ...

  7. iOS 项目中用到的一些开源库和第三方组件

    iOS 项目中用到的一些 iOS 开源库和第三方组件 分享一下我目前所在公司 iOS 项目中用到的一些 iOS 开源库和第三方组件, 感谢开源, 减少了我们的劳动力, 节约了我们大量的时间, 让我们有 ...

  8. Tiny Mapper是一个.net平台开源的对象映射组件

    NET平台开源项目速览(14)最快的对象映射组件Tiny Mapper   阅读目录 1.Tiny Mapper基本介绍 2.Tiny Mapper 基本使用 3.Tiny Mapper 指定配置使用 ...

  9. 【Android开发精要笔记】Android组件模型解析

    Android组件模型解析 Android中的Mashup 将应用切分成不同类别的组件,通过统一的定位模型和接口标准将他们整合在一起,来共同完成某项任务.在Android的Mashup模式下,每个组件 ...

随机推荐

  1. [nodejs] day1-创建服务器

    一.使用匿名函数(新建文件service.js)创建一个服务器: var http = require("http"); //Node.js自带的 http 模块,并且把它赋值给 ...

  2. java_db常见错误总结

    1.java.sql.SQLSyntaxErrorException: ORA-00911: 无效字符 在拼写seq时是否存在存在特殊字符,如:常见语句后面添加了;2.ORA-01722:无效数字解决 ...

  3. yii2 邮件发送(有图有真相)

    经典的密码找回方案是发送邮件到用户邮箱然后修改密码,下面利用yii2 高级版的mail功能,进行邮件的发送,如下图 1.在comm/config/main-local.php中添加 'mailer' ...

  4. http协议详解(超详细)

    http1. 基础概念篇 1.1 介绍 HTTP是Hyper Text Transfer Protocol(超文本传输协议)的缩写.它的发展是万维网协会(World Wide Web Consorti ...

  5. java静态初始化代码块

    /* * 为什么Java中为什么没有静态构造函数.其实Java中不叫静态构造函数,称作静态初始化,或者静态代码块. * 可以通过这样的代码实现相同的功能: */ public class test { ...

  6. (@WhiteTaken)设计模式学习——原型模式

    有这样一个需求,两个对象,只是名称以及其他几个属性不一样,而其他的大部分的属性都是相同的. 这时候我们可以用到原型模式,也就是克隆模式. 原型模式:原型模式是一个对象创建型模式,通过克隆原对象,可以使 ...

  7. 1.1XAF框架开发视频教程-简单的订单管理实现过程,视频,提纲,及教程源码

    下面是视频教程的提纲: PPT版本的提纲下载 本节源码下载 XAF框架开发教程 快速实现企业级信息系统开发的利器 XAF简介 ´  开发公司:www.devexpress.com,老牌控件公司 ´  ...

  8. 纪中集训 Day 7

    今天超级不爽啊啊啊啊 尼玛我三道题都想出来了就是没对一道,第一题没理负数尼玛题目没告诉我,第二题尼玛题目也没说最近的点是第(l+r)/2而不是距离为(a[l]+a[r])/2啊啊啊啊,第三题没打GCD ...

  9. Keepalived安装与配置

      下载并解压Keepalived安装包到两台nginx所在的服务器   192.168.200.1   192.168.200.2     执行编译安装(安装目录设置为 /usr/local/kee ...

  10. TI(德州仪器) TMS320C674x逆向分析之一

    一.声明 作者并不懂嵌入式开发,整个逆向流程都是根据自身逆向经验,一步一步摸索出来,有什么错误请批评指正,或者有更好的方法请不吝赐教.个人写作水平有限,文中会尽量把过程写清楚,有问题或是写的不清楚的地 ...