Hangfire源码解析-任务是如何执行的?
程序员文章站
2022-03-20 10:19:56
一、Hangfire任务执行的流程 1. 任务创建时: 将任务转换为Type并存储(如:HangFireWebTest.TestTask, HangFireWebTest, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null) 将参数序列化后存 ......
一、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; } ....省略 } }
上一篇: 2019重点在哪?风口赛道与硬核投资时代
下一篇: 你这个姿势太欠揍了
推荐阅读
-
Mybaits 源码解析 (十二)----- Mybatis的事务如何被Spring管理?Mybatis和Spring事务中用的Connection是同一个吗?
-
Mybaits 源码解析 (六)----- 全网最详细:Select 语句的执行过程分析(上篇)(Mapper方法是如何调用到XML中的SQL的?)
-
Hangfire源码解析-如何实现可扩展IOC的?
-
Hangfire源码解析-任务是如何执行的?
-
Flink 源码解析 —— 深度解析 Flink 是如何管理好内存的?
-
Mybaits 源码解析 (十二)----- Mybatis的事务如何被Spring管理?Mybatis和Spring事务中用的Connection是同一个吗?
-
Mybaits 源码解析 (六)----- 全网最详细:Select 语句的执行过程分析(上篇)(Mapper方法是如何调用到XML中的SQL的?)
-
think如何实现php定时执行任务,且时间是可配置的
-
think如何实现php定时执行任务,且时间是可配置的
-
Flink 源码解析 —— 深度解析 Flink 是如何管理好内存的?