Hangfire源码解析-任务是如何执行的?
一、Hangfire任务执行的流程
- 任务创建时:
- 将任务转换为Type并存储(如:HangFireWebTest.TestTask, HangFireWebTest, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null)
- 将参数序列化后存储
 
- 任务执行时:
- 根据Type值判断是否是静态方法,若非静态方法就根据Type从IOC容器中取实例。
- 反序列化参数
- 使用反射调用方法:MethodInfo.Invoke
 
二、Hangfire执行任务
从源码中找到“CoreBackgroundJobPerformer”执行任务的方法
internal class CoreBackgroundJobPerformer : IBackgroundJobPerformer
{
    private readonly JobActivator _activator;   //IOC容器
    ....省略
    //执行任务
    public object Perform(PerformContext context)
    {
        //创建一个生命周期
        using (var scope = _activator.BeginScope(
            new JobActivatorContext(context.Connection, context.BackgroundJob, context.CancellationToken)))
        {
            object instance = null;
            if (context.BackgroundJob.Job == null)
            {
                throw new InvalidOperationException("Can't perform a background job with a null job.");
            }
            //任务是否为静态方法,若是静态方法需要从IOC容器中取出实例
            if (!context.BackgroundJob.Job.Method.IsStatic)
            {
                instance = scope.Resolve(context.BackgroundJob.Job.Type);
                if (instance == null)
                {
                    throw new InvalidOperationException(
                        $"JobActivator returned NULL instance of the '{context.BackgroundJob.Job.Type}' type.");
                }
            }
            var arguments = SubstituteArguments(context);
            var result = InvokeMethod(context, instance, arguments);
            return result;
        }
    }
    //调用方法
    private static object InvokeMethod(PerformContext context, object instance, object[] arguments)
    {
        try
        {
            var methodInfo = context.BackgroundJob.Job.Method;
            var result = methodInfo.Invoke(instance, arguments);//使用反射调用方法
            ....省略
            return result;
        }
        ....省略
    }
}
Hangfire源码解析-任务是如何执行的?的更多相关文章
- Hangfire源码解析-如何实现可扩展IOC的?
		一.官方描述 These projects simplify the integration between Hangfire and your favorite IoC Container. The ... 
- 【源码解析】Sharding-Jdbc的执行过程(一)
		一.ShardingContext 在Sharding-Jdbc中,我们其实需要抓住一个核心类,也就是ShardingContext,分片上下文,里面定义了下面几个内容: @RequiredArgsC ... 
- MyBatis源码解析(一)——执行流程
		原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6603926.html 一.MyBatis简介 MyBatis框架是一种轻量级的ORM框架, ... 
- mvc5 源码解析2-2 mvchandler的执行
		我们从application获取的时候查看stepmanager的实现类 IHttpHandler applicationInstance = HttpApplicationFactory.GetAp ... 
- restTemplate源码解析(四)执行ClientHttpRequest请求对象
		所有文章 https://www.cnblogs.com/lay2017/p/11740855.html 正文 上一篇文章中,我们创建了一个ClientHttpRequest的实例.本文将继续阅读Cl ... 
- springMVC源码解析--ViewResolver视图解析器执行(三)
		之前两篇博客springMVC源码分析--ViewResolver视图解析器(一)和springMVC源码解析--ViewResolverComposite视图解析器集合(二)中我们已经简单介绍了一些 ... 
- Mybatis 系列10-结合源码解析mybatis 的执行流程
		[Mybatis 系列10-结合源码解析mybatis 执行流程] [Mybatis 系列9-强大的动态sql 语句] [Mybatis 系列8-结合源码解析select.resultMap的用法] ... 
- [Java多线程]-线程池的基本使用和部分源码解析(创建,执行原理)
		前面的文章:多线程爬坑之路-学习多线程需要来了解哪些东西?(concurrent并发包的数据结构和线程池,Locks锁,Atomic原子类) 多线程爬坑之路-Thread和Runable源码解析 多线 ... 
- Springboot打包执行源码解析
		一.打包 Springboot打包的时候,需要配置一个maven插件[spring-boot-maven-plugin] <build> <plugins> <plugi ... 
随机推荐
- 《javascript语言精粹》读书笔记 Item1 精华与语法
			第一章 精华 任何语言都有其精华的部分和鸡肋的部分,javascript也不例外,而且鸡肋的部分还很多.但javascript的流行却不受他的质量影响. javascript为何如此流行?因为他是we ... 
- 你不知道的JavaScript--Item5 全局变量
			1.尽量少用全局对象 全局变量的问题在于,你的JavaScript应用程序和web页面上的所有代码都共享了这些全局变量,他们住在同一个全局命名空间,所以当程序的两个不同部分定义同名但不同作用的全局变量 ... 
- TestNG监听器实现用例运行失败自动截图、重运行功能
			注: 以下内容引自 http://blog.csdn.net/sunnyyou2011/article/details/45894089 (此非原出处,亦为转载,但博主未注明原出处) 使用Testng ... 
- 理解channel   工作原理以及源码
			Go 的并发特性 goroutines: 独立执行每个任务,并可能并行执行 channels: 用于 goroutines 之间的通讯.同步 一个简单的事务处理的例子 对于下面这样的非并发的程序: ... 
- BZOJ_1579_[Usaco2009 Feb]Revamping Trails 道路升级_分层图最短路
			BZOJ_1579_[Usaco2009 Feb]Revamping Trails 道路升级_分层图最短路 Description 每天,农夫John需要经过一些道路去检查牛棚N里面的牛. 农场上有M ... 
- java.lang.NoSuchMethodError: org.springframework.boot.builder.SpringApplicationBuilder.<init>([Ljava
			搭建spring cloud的时候,报以下错误: java.lang.NoSuchMethodError: org.springframework.boot.builder.SpringApplica ... 
- 浅谈surging服务引擎中的rabbitmq组件和容器化部署
			1.前言 上个星期完成了surging 的0.9.0.1 更新工作,此版本通过nuget下载引擎组件,下载后,无需通过代码build集成,引擎会通过Sidecar模式自动扫描装配异构组件来构建服务引擎 ... 
- 彻底理解浏览器的缓存机制(http缓存机制)
			一.概述 浏览器的缓存机制也就是我们说的HTTP缓存机制,其机制是根据HTTP报文的缓存标识进行的,所以在分析浏览器缓存机制之前,我们先使用图文简单介绍一下HTTP报文,HTTP报文分为两种: 同步s ... 
- mqtt服务器apollo的搭建和测试工具paho的使用
			(1)前言 MQTT协议是IBM开发的一个即时通讯协议; 基于发布/订阅的消息协议,近些年来被广泛应用于能源.电力.....等硬件性能低下的远程设备,此外国内很多企业使用MQTT作为android手机 ... 
- 『片段』ShellHelper 控制台程序 的 程序调用(支持输入命令得到返回字符串输出)
			背景: > 之前做 OGG 时,被 OGG的配置 恶心到了.(OGG是啥,这里就不解释了) > 总之就是一个 控制台程序,总是得手动执行一堆命令,每次都得输入 —— 实在是打字打累了. & ... 
