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 ...
随机推荐
- Selenium webdriver定位iframe里面元素
在查找元素过程中,直接通过id或者xpath等找不到元素,查看页面源代码发现元素是属于iframe里,例如: <div class="wrap_login"> < ...
- Java 字符流文件读写
上篇文章,我们介绍了 Java 的文件字节流框架中的相关内容,而我们本篇文章将着重于文件字符流的相关内容. 首先需要明确一点的是,字节流处理文件的时候是基于字节的,而字符流处理文件则是基于一个个字符为 ...
- baseFileWriter.go
package blog4go import ( "fmt" "os" "sync" "time" ) const ( ...
- channel.go
) c.RLock() client, ok := c.clients[msg.clientID] c.RUnlock() if ok ...
- balancer.go
package) , { close(b.upc) } return nil } func getHost(ep string) string { url, u ...
- 【Floyd】BZOJ1491: [NOI2007]社交网络
Description Solution n<=100自然联想Floyd 设两个数组d[n][n]存最短距离,t[n][n]存最短路径条数 更新d的时候顺便更新t,乘法原理 if(d[i][ ...
- spot 状压dp
题目大意:数轴上有n个泥点,共有m个木板,求最少用几个木板可以覆盖全部泥点,并求最优方案数(n,m<=15) 看范围,肯定是状压 f[i][j]表示前i个泥点都被覆盖,使用的木板集合为j 转移: ...
- 在openjdk8下看Unsafe源码
尽管有传言JAVA9可能会移除Unsafe类,但不妨碍我们理解它的原理.因为类不在了,native方法还在那里.就像菜换样了,食材就那些没变.一个好厨师不仅仅需要会做菜,还需要能识别食材特性...来吧 ...
- python-----HTMLTestRunner报告生成注意点!
简单的测试加HTMLTestRunner使用的具体方式如下:
- linux 挂载共享文件夹
1.背景 通常会有这样的场景,开发人员在Windows编写代码,然后放在linux环境编译,我们通过mount命令就可以实现将代码直接挂到linux环境上去,使Windows上的共享文件夹就像linu ...