`

cindy源码阅读(7)Dispatcher

阅读更多
cindy中的Dispatcher 其实就是最后的执行了,也就是多线程的体现了。
void dispatch(Session session, Runnable event);

这个是Dispatcher 最重要的方法,可以看到还是离不开session。
Runnable 这里cindy通用的做法是调用的时候才定义具体的实现。

有两个实现类,DefaultDispatcher和DirectDispatcher。用哪个是由DispatcherFactory决定的,默认是DefaultDispatcher。

DirectDispatcher的实现:
  public void dispatch(Session session, Runnable event) {
        Queue queue = getQueue();
        queue.add(event); // enqueue

        if (queue.size() == 1) {
            event.run();
            queue.poll(); // dequeue current runnable
            for (Runnable task = null; (task = (Runnable) queue.peek()) != null; queue
                    .poll())
                task.run();
        }
    }

DirectDispatcher的实现其实很简单:就是来一个任务执行一个,没用到多线程。所以是会比较影响性能的。


DefaultDispatcher的实现:
public void dispatch(Session session, Runnable event) {
        Worker worker = null;
        synchronized (mainLock) {
            worker = getWorker(session);
        }
        if (Thread.currentThread() == worker) {
            dispatcher.dispatch(session, event);
        } else {
            BlockingQueue queue = worker.queue;
            if (!queue.offer(event)) {
                // flow control
                if (elapsedTime.getElapsedTime() >= 10000) {
                    elapsedTime.reset();
                    log.warn("dispatcher flow control");
                }
                try {
                    queue.put(event);
                } catch (InterruptedException e) {
                }
            }
        }
    }

DefaultDispatcher的实现其实就是没个session都搞了个Worker,其实就是一个线程,这样就会是多线程去处理了。
 private class Worker extends Thread {


synchronized (this) {
                            try {
                                wait(keepAliveTime);
                            } catch (InterruptedException e) {
                            }
                        }

对于Worker来说每次线程不是用完就关闭掉,为了避免线程的频繁创建和回收,线程默认会持续一段时间,如果在这个时间内同一个session的下一个请求会重用这个worker。这个时间默认是5秒。

对于DefaultDispatcher来说block方法其实就是在不同的worker重用的时候起作用,正在用的worker不能重用。
在DefaultFuture中有使用:
public boolean complete() {
        if (!completed) {
            synchronized (this) {
                while (!completed) {
                    dispatcher.block(); // block dispatcher
                    try {
                        wait();
                    } catch (InterruptedException e) {
                    }
                }
            }
        }
        return succeeded;
    }



dispatch的使用场景有:ChannelReactorHandler,DefaultFuture,DispatcherFilter。就是所有希望用到多线程的地方,都使用dispatch。



分享到:
评论

相关推荐

    Struts2源码阅读

    源码阅读对于理解其工作原理至关重要。本文将深入探讨Struts2的核心概念、类和请求处理流程。 首先,我们来看Struts2的架构流程。当客户端发起一个请求时,请求会经过一系列的Filter,首先是`ActionContextCleanUp`...

    dispatcher 源码详解

    ### DispatcherServlet 源码详解 #### 一、DispatcherServlet 的核心作用与职责 ##### 1.1 前端控制器设计模式实现 DispatcherServlet 是 Spring MVC 框架的核心组件之一,它作为前端控制器模式的具体实现,为...

    WPF 管理系统源码分享.7z

    【标题】"WPF 管理系统源码分享.7z" 提供的是一个基于Windows Presentation Foundation(WPF)技术构建的管理系统的源代码。WPF是微软.NET Framework的一部分,用于构建桌面应用程序,它提供了丰富的用户体验和强大...

    Dispatcher,.zip

    - 访问项目的GitHub或其他代码托管平台,阅读README文件获取快速入门指南。 - 探索项目的源代码结构,理解各个模块的功能。 - 查阅项目文档,了解如何配置和使用Dispatcher。 - 参与社区讨论,提出问题或分享你的...

    Laravel开发-dispatcher

    在Laravel框架中,Dispatcher是一个核心组件,它主要用于调度任务,比如定时运行Artisan命令、执行计划任务等。本文将深入探讨Laravel开发中的Dispatcher及其如何在应用程序中计划Artisan命令。 1. Laravel ...

    Ofbiz源码阅读笔记 之 请求控制篇

    ### Ofbiz源码阅读笔记之请求控制篇 #### 一、引言 本文档基于Ofbiz 10.04.02版本进行解读,旨在深入分析Ofbiz框架中的请求控制流程及其关键技术点。Ofbiz是一款开源的企业级应用框架,支持多种业务场景,包括电子...

    dispatcher

    在IT行业中,Dispatcher通常指的是一个分发器或者调度器,它在不同的通信协议之间起着桥梁的作用。在Java编程中,实现各种通信协议是构建网络应用程序的关键部分。本篇文章将详细探讨标题"dispatcher"所涉及的Java...

    struts2 源码分析

    4. Struts2(2.1.2) 部分源码阅读 从 org.apache.struts2.dispatcher.FilterDispatcher 开始 Java 代码阅读,我们可以看到 FilterDispatcher 的 init 方法,它负责初始化 Dispatcher 对象,并创建了一个 ...

    WP7运动秒表源码

    在本项目中,"WP7运动秒表源码" 是一个专门为Windows Phone 7平台设计的运动计时应用。这个程序允许用户进行多任务计时,特别适合于需要分段计时的活动,如跑步时的分圈计时。源码的提供主要是为了供开发者学习和...

    Laravel开发-dispatcher 任务分发器

    在Laravel框架中,Dispatcher(任务分发器)是一个核心组件,它负责处理异步任务和计划任务。本文将深入探讨Laravel中的任务调度和分发机制,以及如何使用Dispatcher来实现更高效、灵活的任务管理。 ### Laravel ...

    Struts 2.1.6 src 源码

    通过阅读源码,我们可以了解到框架的设计原则、实现细节以及潜在的改进空间。同时,了解源码也有助于学习软件设计模式,提升我们的编程技能。在实际开发中,结合官方文档和社区资源,对源码进行有目标的学习,将使你...

    plexus-sec-dispatcher-1.3.jar

    plexus-sec-dispatcher-1.3.jar

    WP7世界时钟源码

    《WP7世界时钟源码解析与学习指南》 Windows Phone 7(简称WP7)是微软公司推出的一款智能手机操作系统,其丰富的API和强大的开发工具为开发者提供了广阔的设计空间。在移动应用开发领域,世界时钟是一个常见的功能...

    xml里filter-mapping中的dispatcher的使

    ### XML中的filter-mapping与dispatcher使用详解 在Java Web开发中,过滤器(Filter)是十分重要的组件之一,主要用于处理客户端请求或响应服务器反馈时的数据处理任务,如编码转换、登录验证、敏感词过滤等。而在...

    dispatcher.doc

    7. `assign`:这个函数克隆调度树中的一个节点到新的位置。它允许在不改变原有结构的情况下,复用和调整节点。 8. `entry` 和 `get`:这两个函数与调度树的节点创建和管理有关。`entry`创建一个新的调度节点,设置...

    WPF源码集合适合新手

    文件名“WPF揭秘源码”可能包含了对WPF关键组件的源码分析,例如Dispatcher、EventRoute、VisualTree等。理解这些底层机制可以帮助开发者更高效地利用WPF,解决性能问题,或者开发自定义控件。 在实际学习过程中,...

    Dispatcher 多线登录,辅助登录

    Dispatcher是多线程编程中的一个重要概念,特别是在Java和Spring框架中。Dispatcher主要负责调度任务,协调并发执行的各个部分,确保程序的高效运行和资源的合理分配。在本主题中,我们将深入探讨Dispatcher如何实现...

    OKhttp3源码

    **OKhttp3源码分析** ...其源码分析可以帮助我们深入理解网络请求的工作原理,优化网络性能,以及定制化需求。本篇文章将围绕OKhttp3的核心组件、...通过源码阅读,我们可以了解到网络通信的细节,提高我们的编程能力。

    cakephp框架源码

    源码阅读是理解任何框架本质的重要途径,对于CakePHP也不例外。通过对源码的深入剖析,我们可以了解其核心机制、设计思想以及实现原理。 首先,我们要明确MVC模式在CakePHP中的作用。M(Model)负责数据的处理和...

Global site tag (gtag.js) - Google Analytics