ONOS eventDispatcher代码分析

首先看defaultEventSinkregistry类,该类中使用了ConcurrentHashMap来存储事件池,事件为key,eventSink为相对应的value


在CoreEventDispatcher中,首先定义了默认执行时间为5000ms,watchdog为250ms,使用了阻塞队列来处理events,并创建了一个单线程化的线程池,保证所有任务按照顺序执行。newSingalThreadPool源码中FinalizableDelegatedExecutorService使用了代理模式,真正调用的是threadPoolExecutor,threadPoolExecutor中使corePoolSize和maximumPoolSize都为1,以此实现单线程化的线程池。



在ONOS控制器中的事件监听器最后提到,post方法其实是调用了eventDispatcher的post方法,这里为post方法的具体实现,events为blockingQueue类,调用add方法,把event加入阻塞队列,add()方法如果加入成功会返回true,如果队满会抛出异常

下面进入activate方法,首先初始化dispatchloop,首先用volatile关键字保证diapatchloop的状态是对所有线程可见的,线程开始时,将stop状态设为false,开始while死循环。从events队列里取出下一个要执行的event,如果event取得KILL_PILL事件时就会跳出循环(当deactivate方法调用时会向队列里提交一个KILL_PILL事件)。下一步就是pocess event


回到activate方法,dispatchFuture是一个异步返回类,将dispatchLoop提交上去进行处理,启动watchDog,watchDog用来检测线程运行时间,一旦线程运行事件超过提前设定的最大运行时间,就会终止当先的dispatch loop并且提交一个新的。

你可能感兴趣的:(ONOS eventDispatcher代码分析)