关于 hangfire 初始化工作机制



hangfire初始化的配置方法 :UseHangfire 。

   public static class OwinBootstrapper
    {
        /// <summary>
        /// Bootstraps Hangfire components using the given configuration
        /// action and maps Hangfire Dashboard to the app builder pipeline
        /// at the configured path (‘/hangfire‘ by default).
        /// </summary>
        /// <param name="app">The app builder</param>
        /// <param name="configurationAction">Configuration action</param>
        public static void UseHangfire([NotNull] this IAppBuilder app,[NotNull] Action<IBootstrapperConfiguration> configurationAction)
        {
            if (app == null) throw new ArgumentNullException("app");
            if (configurationAction == null) throw new ArgumentNullException("configurationAction");
            // 初始化配置,给了默认值
            var configuration = new BootstrapperConfiguration();
            // 委托  赋值
            configurationAction(configuration);

            if (configuration.Activator != null)
            {
                JobActivator.Current = configuration.Activator;
            }

            if (configuration.Storage == null)
            {
                throw new InvalidOperationException("Job storage was not configured. Please call either `UseStorage` method or its overloads.");
            }
            // 获取当前的存储方式
            JobStorage.Current = configuration.Storage;
            // 通过UseFilter()将配置的过滤器放入容器中
            foreach (var filter in configuration.Filters)
            {
                GlobalJobFilters.Filters.Add(filter);
            }
            // 通过UseServers()将配置的过滤器放入容器中
            foreach (var server in configuration.Servers)
            {
                app.RunHangfireServer(server());
            }
            // 将Route和权限filter注入到owin管道中
            app.MapHangfireDashboard(configuration.DashboardPath, configuration.AuthorizationFilters);
        }
    }

用委托的方式来处理而不是让开发人员自己去实现IBootstrapperConfiguration接口

这种方式确实开发人员使用上更方便了。


      public static void MapHangfireDashboard(
            [NotNull] this IAppBuilder app,
            string dashboardPath,
            IEnumerable<IAuthorizationFilter> authorizationFilters,
            JobStorage storage)
        {
            if (app == null) throw new ArgumentNullException("app");

            SignatureConversions.AddConversions(app);

            app.Map(dashboardPath,subApp => subApp.Use<DashboardMiddleware>(
                storage,
                DashboardRoutes.Routes,
                authorizationFilters));
        }
MapHangfireDashboard方法是将DashboardMiddleware注册到own管道中
dashboardPath默认值是“/hangfire”  ,也就是说当你通过 Http://www.xxx.com/hangfire 访问的每个请求都会进入DashboardMiddleware

DashboardMiddleware继承了OwinMiddleware
 // 方法在DashboardMiddleware内

        public override Task Invoke(IOwinContext context)
        {
            // RouteCollection 是路由规则集合,
            var dispatcher = _routes.FindDispatcher(context.Request.Path.Value);

            if (dispatcher == null)
            {
                // 下一个OwinMiddleware中去处理
                // 一个请求会有多个OwinMiddleware
                return Next.Invoke(context);
            }

            foreach (var filter in _authorizationFilters)
            {
                if (!filter.Authorize(context.Environment))
                {
                    context.Response.StatusCode = (int) HttpStatusCode.Unauthorized;
                    return Task.FromResult(false);
                }
            }

            // 输出内容
            var dispatcherContext = new RequestDispatcherContext(
                _storage,
                context.Environment,
                dispatcher.Item2);

            return dispatcher.Item1.Dispatch(dispatcherContext);
        }

RequestDispatcherContext 内部调度实现相对有些复杂,暂时没时间去研究,我机会再分享了。 
 
时间: 2024-11-18 01:04:03

关于 hangfire 初始化工作机制的相关文章

重读《深入理解Java虚拟机》五、虚拟机如何执行字节码?虚拟机执行引擎的工作机制

Class文件二进制字符流通过类加载器和虚拟机加载到内存(方法区)完成在内存上的布局和初始化后,虚拟机字节码执行引擎就可以执行相关代码实现程序所定义的功能.虚拟机执行引擎执行的对象是方法(均特指非本地方法),方法是 着一个程序所定义的一个功能的载体,实现预定的业务功能或者特定的功能等. Java虚拟机内存内针对方法的执行专门划分了一个区域即虚拟机栈.虚拟机栈内通过栈帧结构来存储调用方法和执行方法需要的局部变量,操作数栈.方法返回值等,通过栈帧的出入栈来表示方法的执行顺序. 1.栈帧结构:虚拟机内

深入struts2(三)---工作机制和运行流程图

1     工作原理 1.1     体系架构 图2.1 struts2.0体系架构图 1.2     工作机制 针对上节体系架构图,以下分步说明运行流程 ?  client初始化一个指向Servlet容器(比如Tomcat)的请求: ?  这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做ActionContextCleanUp的可选过滤器,这个过滤器对于Struts2和其它框架的集成非常有帮助,比如:SiteMesh Plugin): 注:从struts2.1.3后就不须要配

详细深入分析 ClassLoader 工作机制

申明:本文首发于 详细深入分析 Java ClassLoader 工作机制 ,如有转载,注明原出处即可,谢谢配合. 详细深入分析 Java ClassLoader 工作机制 什么是 ClassLoader ClassLoader 作用 1ClassLoader 类结构分析 2ClassLoader 的等级加载机制 Java默认提供的三个ClassLoader ClassLoader加载类的原理 原理介绍 2为什么要使用双亲委托这种模型呢 3 但是JVM在搜索类的时候又是如何判定两个class是相

Java I/O工作机制

I/O 问题可以说是当今互联网 Web 应用中所面临的主要问题之一,因为当前在这个海量数据时代,数据在网络中随处流动.这个流动的过程中都涉及到 I/O 问题,可以说大部分 Web 应用系统的瓶颈都是 I/O 瓶颈. 字节I/O 字节输入流InputStream InputStream本身是一个抽象类,要想使用此类必须依靠其子类.如果需要从文件中读取字节流,就用FileInputStream来实现. public class FileInputStreamTest { public static

JavaScript工作机制:V8 引擎内部机制及如何编写优化代码的5个诀窍

概述 JavaScript引擎是一个执行JavaScript代码的程序或解释器.JavaScript引擎可以被实现为标准解释器,或者实现为以某种形式将JavaScript编译为字节码的即时编译器. 下面是实现了JavaScript引擎的一个热门项目列表: V8- 开源,由Google开发,用C++编写的 Rhino - 由Mozilla基金所管理,开源,完全用Java开发 SpiderMonkey-第一个JavaScript引擎,最早用在Netscape Navigator上,现在用在Firef

深入struts2(三)---工作机制和执行流程图

1     工作原理 1.1     体系架构 图2.1 struts2.0体系架构图 1.2     工作机制 针对上节体系架构图,下面分步说明执行流程 ?  客户端初始化一个指向Servlet容器(例如Tomcat)的请求: ?  这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做ActionContextCleanUp的可选过滤器,这个过滤器对于Struts2和其他框架的集成很有帮助,例如:SiteMesh Plugin): 注:从struts2.1.3后就不需要配置Act

Session的工作机制详解和安全性问题(PHP实例讲解)

我们先简单的了解一些http的知识,从而理解该协议的无状态特性.然后,学习一些关于cookie的基本操作.最后,我会一步步阐述如何使用一些简单,高效的方法来提高你的php应用程序的安全性以及稳定行. 我想大多数的php初级程序员一定会认为php默认的session机制的安全性似乎是有一定保障的,事实恰好相反 – php团队只是提供了一套便捷的session的解决方案提供给程序员使用,至于安全性的话,应该由程序员来加强,这是应用程序开发团队的责任.因为,这 里面的方法很多,可以这么说吧,没有最好,

Struts工作机制

Struts工作机制? 为什么要使用Struts?工作机制:Struts的工作流程:在web应用启动时就会加载初始化ActionServlet,ActionServlet从struts-config.xml文件中读取配置信息,把它们存放到各种配置对象当ActionServlet接收到一个客户请求时,将执行如下流程.- (1)检索和用户请求匹配的ActionMapping实例,如果不存在,就返回请求路径无效信息;- (2)如果ActionForm实例不存在,就创建一个ActionForm对象,把客

malloc 函数工作机制(转)

malloc()工作机制 malloc函数的实质体现在,它有一个将可用的内存块连接为一个长长的列表的所谓空闲链表.调用malloc函数时,它沿连接表寻找一个大到足以满足用户请求所需要的内存块.然后,将该内存块一分为二(一块的大小与用户请求的大小相等,另一块的大小就是剩下的字节).接下来,将分配给用户的那块内存传给用户,并将剩下的那块(如果有的话)返回到连接表上.调用free函数时,它将用户释放的内存块连接到空闲链上.到最后,空闲链会被切成很多的小内存片段,如果这时用户申请一个大的内存片段,那么空