博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Storm-源码分析- hook (backtype.storm.hooks)
阅读量:6759 次
发布时间:2019-06-26

本文共 2193 字,大约阅读时间需要 7 分钟。

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 values;    public String stream;    public int taskId;    public Collection
outTasks; public EmitInfo(List
values, String stream, int taskId, Collection
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
_hooks = new ArrayList
(); public void addTaskHook(ITaskHook hook) { hook.prepare(_stormConf, this); _hooks.add(hook); } public Collection
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

转载地址:http://kadeo.baihongyu.com/

你可能感兴趣的文章
****RESTful API 设计最佳实践(APP后端API设计参考典范)
查看>>
Linux内存管理-高端内存(二)
查看>>
[LeetCode] Longest Substring Without Repeating Characters 最长无重复字符的子串
查看>>
FU-A分包方式,以及从RTP包里面得到H.264数据和AAC数据的方法。。
查看>>
[LeetCode] 4Sum 四数之和
查看>>
Hello World 之 控制台版本(Console Application)
查看>>
IOS 播放动态Gif图片
查看>>
随笔1
查看>>
HTML中Select的使用具体解释
查看>>
Java synchronized
查看>>
mysql大内存高性能优化方案
查看>>
VSTO 学习笔记(十二)自定义公式与Ribbon
查看>>
[再寄小读者之数学篇](2015-06-24 Series)
查看>>
【Linux】linux常用基本命令
查看>>
4-python学习——数据操作
查看>>
Oracle函数
查看>>
Unity3D学习笔记第一课
查看>>
【redis使用全解析】常见运维操作
查看>>
hdu2377Bus Pass(构建更复杂的图+spfa)
查看>>
Vc6.0打开该文件坠毁
查看>>