Storm-原始碼分析-hook(backtype.storm.hooks)
task hook
在某些task事件發生時, 如果使用者希望執行一些額外的邏輯, 就需要使用hook
當前定義如下事件, emit, cleanup, spoutAck……
使用者只需要開發實現ITaskHook的類, 並將類名配置到(storm-conf TOPOLOGY-AUTO-TASK-HOOKS)
系統會在這些事件發生時, 自動呼叫所有註冊的hook中的相應的functions
public interface ITaskHook { void prepare(Map conf, TopologyContext context); void cleanup(); void emit(EmitInfo info); void spoutAck(SpoutAckInfo info); void spoutFail(SpoutFailInfo info); void boltExecute(BoltExecuteInfo info); void boltAck(BoltAckInfo info); void boltFail(BoltFailInfo info); }
public class EmitInfo { public List<Object> values; public String stream; public int taskId; public Collection<Integer> outTasks; public EmitInfo(List<Object> values, String stream, int taskId, Collection<Integer> outTasks) { this.values = values; this.stream = stream; this.taskId = taskId; this.outTasks = outTasks; } }
1. add hook
在mk-task的時候, 會從storm-conf配置裡面讀出hooks的class names
建立hook物件, 加入到TopologyContext的_hooks中
(defn mk-task [executor-data task-id] (doseq [klass (storm-conf TOPOLOGY-AUTO-TASK-HOOKS)] (.addTaskHook ^TopologyContext (:user-context task-data) (-> klass Class/forName .newInstance))) )
public class TopologyContext extends WorkerTopologyContext implements IMetricsContext { private List<ITaskHook> _hooks = new ArrayList<ITaskHook>(); public void addTaskHook(ITaskHook hook) { hook.prepare(_stormConf, this); _hooks.add(hook); } public Collection<ITaskHook> getHooks() { return _hooks; } }
2. apply hook
當發生相應的事件時, 呼叫事先註冊的hooks
下面的例子是在emit時, 呼叫相應的hooks
apply-hooks巨集實現也很簡單, 從topology context中取出hooks列表, 對每個hook呼叫emit(EmitInfo)
(apply-hooks user-context .emit (EmitInfo. values stream task-id out-tasks))
(defmacro apply-hooks [topology-context method-sym info-form]
(let [hook-sym (with-meta (gensym "hook") {:tag `backtype.storm.hooks.ITaskHook})]
`(let [hooks# (get-context-hooks ~topology-context)]
(when-not (hooks-empty? hooks#)
(let [info# ~info-form]
(fast-list-iter [~hook-sym hooks#]
(~method-sym ~hook-sym info#)
))))))
本文章摘自部落格園,原文釋出日期:2013-07-30
相關文章
- Storm-原始碼分析-metricORM原始碼
- Storm-原始碼分析-Thrift的使用ORM原始碼
- Storm-原始碼分析-Multimethods使用例子ORM原始碼
- Storm-原始碼分析-TopologySubmit-TaskORM原始碼MIT
- Storm-原始碼分析-timer(backtype.storm.timer)ORM原始碼
- Java Shutdown Hook 場景使用和原始碼分析JavaHook原始碼
- Android Hook框架Xposed原理與原始碼分析AndroidHook框架原始碼
- Storm-原始碼分析-TopologySubmit-Task-TopologyContext(backtype.storm.task)ORM原始碼MITContext
- React Hook原始碼解析(二)ReactHook原始碼
- 微信全功能HOOK介面原始碼Hook原始碼
- 外掛化知識梳理(6) Small 原始碼分析之 Hook 原理原始碼Hook
- Vue 原始碼解讀(7)—— Hook EventVue原始碼Hook
- Webpack原始碼基礎-Tapable從使用Hook到原始碼解析Web原始碼Hook
- PReact10.5.13原始碼理解之hookReact原始碼Hook
- 企業微信PC版hook原始碼api介面Hook原始碼API
- Retrofit原始碼分析三 原始碼分析原始碼
- 集合原始碼分析[2]-AbstractList 原始碼分析原始碼
- 集合原始碼分析[1]-Collection 原始碼分析原始碼
- 集合原始碼分析[3]-ArrayList 原始碼分析原始碼
- Guava 原始碼分析之 EventBus 原始碼分析Guava原始碼
- Android 原始碼分析之 AsyncTask 原始碼分析Android原始碼
- 【JDK原始碼分析系列】ArrayBlockingQueue原始碼分析JDK原始碼BloC
- 以太坊原始碼分析(36)ethdb原始碼分析原始碼
- 以太坊原始碼分析(38)event原始碼分析原始碼
- 以太坊原始碼分析(41)hashimoto原始碼分析原始碼
- 以太坊原始碼分析(43)node原始碼分析原始碼
- 以太坊原始碼分析(52)trie原始碼分析原始碼
- 深度 Mybatis 3 原始碼分析(一)SqlSessionFactoryBuilder原始碼分析MyBatis原始碼SQLSessionUI
- 以太坊原始碼分析(51)rpc原始碼分析原始碼RPC
- 【Android原始碼】Fragment 原始碼分析Android原始碼Fragment
- 【Android原始碼】Intent 原始碼分析Android原始碼Intent
- k8s client-go原始碼分析 informer原始碼分析(6)-Indexer原始碼分析K8SclientGo原始碼ORMIndex
- k8s client-go原始碼分析 informer原始碼分析(4)-DeltaFIFO原始碼分析K8SclientGo原始碼ORM
- 以太坊原始碼分析(20)core-bloombits原始碼分析原始碼OOM
- 以太坊原始碼分析(24)core-state原始碼分析原始碼
- 以太坊原始碼分析(29)core-vm原始碼分析原始碼
- 【MyBatis原始碼分析】select原始碼分析及小結MyBatis原始碼
- redis原始碼分析(二)、redis原始碼分析之sds字串Redis原始碼字串