// 有数据输入的root节点赋以相应的值,没有数据输入的节点置为空 private void attachRoot(Map<String, Set<String>> map, String fromAlias, DataBag bag) { if (isTap) { roots.get(0).attachInputBag(bag); return; } Iterator<PhysicalOperator> ito = roots.iterator(); PhysicalOperator root = null; while (ito.hasNext()) { root = ito.next(); if (map.get(fromAlias).contains(root.getAlias())) { root.attachInputBag(fromAlias, bag); } else { root.attachInputBag((DataBag[]) null); } } }
public void feedData(String fromAlias, DataBag bag) throws Exception { if (isWindowProcessor()) { ((PhysicalOperator) windowPO).attachInputBag(new DataBag[] {bag}); } else { synchronized (lock) { try { // 第一个节点的情况 ,数据输入为上一级bolt或者tap if (isRoot()) { attachRoot(this.boltLevalInputMap, fromAlias, bag); } else { attachRoot(this.getInputMap(), fromAlias, bag); } executeAndEmit(fromAlias, bag); } finally { this.innerPlan.detachAllInputBag(); } } } }