Dispatcher

Dispatcher是guava EventBus的事件分发器.

Dispatcher是抽象类, 抽象方法: abstract void dispatch(Object event, Iterator<Subscriber> subscribers);
定义了3个内部类: ImmediateDispatcher LegacyAsyncDispatcher PerThreadQueuedDispatcher.
这3个类是Dispatcher的实现.

LegacyAsyncDispatcher现在用PerThreadQueuedDispatcher代替

Subscriber包括EventBus, Object target, Method method, Executor executor.

 1   final void dispatchEvent(final Object event) {
 2     executor.execute(new Runnable() {
 3       @Override
 4       public void run() {
 5         try {
 6           invokeSubscriberMethod(event);  // 调用method, method.invoke(target, event)
 7         } catch (InvocationTargetException e) {
 8           bus.handleSubscriberException(e.getCause(), context(event));
 9         }
10       }
11     });
12   }

Subscriber的dispatchEvent()

1  @Override
2     void dispatch(Object event, Iterator<Subscriber> subscribers) {
3       checkNotNull(event);
4       while (subscribers.hasNext()) {
5         subscribers.next().dispatchEvent(event);
6       }
7     }

ImmediateDispatcher的dispatch()

  void dispatch(Object event, Iterator<Subscriber> subscribers) {
      checkNotNull(event);
      checkNotNull(subscribers);
      Queue<Event> queueForThread = queue.get();  // Queues.newArrayDeque()
      queueForThread.offer(new Event(event, subscribers));

      if (!dispatching.get()) {
        dispatching.set(true);  // 是线程安全的
        try {
          Event nextEvent;
          while ((nextEvent = queueForThread.poll()) != null) {
            while (nextEvent.subscribers.hasNext()) {
              nextEvent.subscribers.next().dispatchEvent(nextEvent.event);
            }
          }
        } finally {
          // 清除
          dispatching.remove();
          queue.remove();
        }
      }
    }
1 PerThreadQueuedDispatcher的dispatch()
2
3 PerThreadQueuedDispatcher包括ThreadLocal<Queue<Event>> queue和ThreadLocal<Boolean> dispatching
4
5 dispatching表示是否正在执行dispatch, queue用于让每个线程有一个独立的事件队列.
时间: 2024-08-26 08:46:52

Dispatcher的相关文章

java.lang.ClassNotFoundException: org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFil

项目启动时报错:java.lang.ClassNotFoundException: org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter struts2的jar包版本号为2.1.8,所以类名是没有错误的,而jar包确实加入进去了.jar包加入的方式是通过user library. 问题解决的办法是:将jar包拷贝到WEB-INF下lib文件夹目录,重新启动tomcat问题解决. ================

Tomcat启动报错[org.apache.struts2.dispatcher.Dispatcher]Dispatcher initialization failed

Tomcat启动报错: [org.apache.struts2.dispatcher.Dispatcher]Dispatcher initialization failed Unable to load configuration. - bean - jar:file:/E:/SoftwareDevelopment/Software/Eclipse4.3/eclipse-jee-kepler-SR1-win32-x86_64/Workspace/.metadata/.plugins/org.ec

Struts2 源码分析——调结者(Dispatcher)之action请求

章节简言 上一章笔者讲到关于struts2启动的时候加载对应的准备工作.如加载配置文件struts.xml之类的信息.而相应的这些操作都离不开Dispatcher类的帮助.如果读者只是认为Dispatcher类的作用只有这些.那真的是大错特错了.所以本章笔者将继续讲到关于Dispatcher类的另一个功能.即是StrutsPrepareFilter类俩项工作中的处理request请求相关信息.在讲解之前,笔者还是想把相关的信息回想一下:当项目启动的时候,strtus2也就启动了.然后就会去初始化

配置 AEM CQ6 (author + publish + apache dispatcher + ubuntu )

AEM CQ系列是Adobe下的企业内容管理系统,现在已知的一些企业比如 Deloitte,Ford Racing,这里就不多做基本的介绍了,明白的看! 今天在Docker配置一下author instance, publish instance, apache dispatcher 文件构架 Author -cq-author-4505.jar -license.properties Publish -cq-author-4503.jar -license.properties Author

org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter

1.先建立一个项目2.在WebRoot中建立一个jsp,名为index.jsp,在里面写一句话 <body> hello struts2 <br> </body> 3.在后台写入代码 public class T { org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter f; } 4.在struts.xml中写入 <constant name="struts.devMo

&lt;filter-mapping&gt;--&lt;dispatcher&gt;

2.4版本的servlet规范在部属描述符中新增加了一个<dispatcher>元素,这个元素有四个可能的值:即REQUEST,FORWARD,INCLUDE和ERROR,可以在一个<filter-mapping>元素中加入任意数目的<dispatcher>,使得filter将会作用于直接从客户端过来的request,通过forward过来的request,通过include过来的request和通过<error-page>过来的request.如果没有指定

The struts dispatcher cannot be found

1.错误描述 严重:Servlet.service() for servlet jsp threw exception The struts dispatcher cannot be found.This is usually called by using struts tags without the associated filters.Struts tags are only usable when the request has passed through its servlet f

Struts2 源码分析——调结者(Dispatcher)之执行action

章节简言 上一章笔者写关于Dispatcher类如何处理接受来的request请求.当然读者们也知道他并非正真的执行action操作.他只是在执行action操作之前的准备工作.那么谁才是正真的执行action呢?本章笔者就带大家来看看StrutsExecuteFilter类的工作.在理解StrutsExecuteFilter类的工作之前,笔者还是希望大家回顾一下前一章讲到的request请求工作.为什么这样子讲呢?可以说StrutsExecuteFilter类的工作是建立在StrutsPrep

dispatcher前端控制器学习笔记

1.dispatcher前段控制器的作用 1.文件上传解析,如果请求类型是multipart,将通过MutilpartResolver进行文件上传解析. 2.通过HandlerMapping,将请求映射到处理器 3.通过HandlerAdapter支持多种类型的处理器 4.通过ViewResolver解析逻辑视图名到具体视图实现 5.本地化解析 6.渲染具体的视图等 7.如果执行过程中遇到异常将交给HandlerExcpetionResolver来解析 DispatcherServlet在web

WPF 线程 Dispatcher

WPF 应用程序从两个线程开始: 一个用于处理呈现 一个用于管理 UI 呈现线程有效地隐藏在后台运行,而UI线程则接收输入.处理事件.绘制屏幕以及运行应用程序代码. 大多数应用程序都使用一个 UI 线程,但在某些情况下,最好使用多个线程.我们将在后面举例说明这一点. UI 线程对一个名为 Dispatcher 的对象内的工作项进行排队. Dispatcher基于优先级选择工作项,并运行每一个工作项,直到完成.每个UI线程都必须至少有一个Dispatcher,并且每个 Dispatcher 都只能