mk-task, 比較簡單, 因為task隻是概念上的結構, 不象其他worker, executor都需要建立程序或線程
是以其核心其實就是mk-task-data,
1. 建立topologycontext對象, 其實就是把之前的topology對象和worker-data混合到一起, 便于task在執行時可以取到需要的topology資訊.
2. 建立task-object, spout-object或bolt-object, 封裝相應的邏輯, 如nexttuple, execute
3. 生成tasks-fn, 名字起的不好,讓人誤解執行了task的功能, 其實就是做些emit之間的準備工作, 其中最重要的就是調用grouper去産生targets task, 當然還包含些metrics, hooks的調用.
說白了其實mk-tasks, 沒做啥事
<a href="http://www.cnblogs.com/fxjwind/p/3217352.html">storm-源碼分析-topology submit-task-topologycontext</a>
:system-context, :user-context, 隻是context中的topology對象不同, system為system-topology!
這裡的builtin-metrics用來記錄spout或bolt的執行狀況的metrics
<a href="http://www.cnblogs.com/fxjwind/p/3225057.html">storm-源碼分析- metric</a>
傳回tasks-fn, 這個函數主要用于做emit之前的準備工作, 傳回target tasks list
1. 調用grouper, 産生target tasks
2. 執行emit hook
3. 滿足sampler條件時, 更新stats和buildin-metrics
task-fn, 兩種不同參數版本
[^string stream ^list values], 這個版本好了解些, 就是将stream對應的component的target tasks都算上(一個stream可能有多個out component, 一份資料需要發到多個bolt處理)
[^integer out-task-id ^string stream ^list values], 指定out-task-id, 即direct grouping
這裡對out-task-id做了驗證
out-task-id (if grouping out-task-id), 即out-task-id->component->grouper不為nil(為:direct?), 即驗證這個stream确實有到該out-task-id對應component
如果驗證失敗, 将out-task-id置nil
取出component的對象,
比如對于spout, 取出spoutspec中的componentobject spout_object, 包含了spout的邏輯, 比如nexttuple()