天天看点

Storm-源码分析- timer (backtype.storm.timer)

timer是基于priorityqueue实现的(和priorityblockingqueue区别, 在于没有阻塞机制, 不是线程安全的), 优先级队列是堆数据结构的典型应用 

默认情况下, 按照自然顺序(其实就是默认comparator的定义), 最小的元素排在堆头 

当然也可以自己重新实现comparator接口, 比如timer就用reify重新实现了comparator接口

整个过程其实比较简单, 开个timer-thread, 不断check priorityqueue里面时间最小的timer是否已经可以触发 

如果可以, 就poll出来, 调用callback, 并sleep, 都很好理解

唯一需要说的是, 这里使用semaphore, 

信号量和lock相似, 都是用于互斥 

不同在于, 信号量模拟资源管理, 所以不同于lock的排他, 信号量可以接收多个aquire(取决于配置) 

另外一个比较大的区别, lock是解铃还须系铃人, 谁锁谁解, 而信号量无所谓, 任何线程都可以调用release, 或acquire 

这里使用信号量, 是用于在cancel-timer时, 等待timer-thread结束

因为cancel的过程就是将active置false, 然后就是调用acquire等待信号量cancel-notifier被释放 

而timer-thread在线程结束前, 会release这个信号量

schedule其实就是往priorityqueue里面插入timer

对于循环schdule, 就是在timer的callback里面, 再次schedule

supervisor中的使用例子, 定期的调用hb函数更新supervisor的hb 

在mk-timer时, 传入的kill-fn callback, 会在timer-thread发生exception的时候被调用

继续阅读