Storm的有环Topology

问题来源

初学Storm, 学习文档上定义Storm的Topology为一个有向无环图。 今天想到,如果Topology中有环又会如何? 所以用一段简单的代码进行了实验

结论

实验结论是,Topology是可以有环的

实验过程

定义拓扑

Created with Raphaël 2.1.0 SimpleSpout SimpleSpout FirstBolt FirstBolt SecondBolt SecondBolt globalGrouping globalGrouping 第一次经过SecondBolt?返回FirstBolt:结束 globalGrouping

代码

package DStorm;

import backtype.storm.Config;
import backtype.storm.LocalCluster;
import backtype.storm.spout.SpoutOutputCollector;
import backtype.storm.task.TopologyContext;
import backtype.storm.topology.BasicOutputCollector;
import backtype.storm.topology.OutputFieldsDeclarer;
import backtype.storm.topology.TopologyBuilder;
import backtype.storm.topology.base.BaseBasicBolt;
import backtype.storm.topology.base.BaseRichSpout;
import backtype.storm.tuple.Fields;
import backtype.storm.tuple.Tuple;
import backtype.storm.tuple.Values;

import java.util.Map;

/**
 * Created by chenhong on 17/4/10.
 */
public class LoopTopology {

    static class SimpleSpout extends BaseRichSpout{

        SpoutOutputCollector collector;
        private static long count =0;

        @Override
        public void open(Map map, TopologyContext topologyContext, SpoutOutputCollector spoutOutputCollector) {
            this.collector = spoutOutputCollector;
        }

        @Override
        public void nextTuple() {
            collector.emit(new Values("A"+(++count)));
            try {
                Thread.sleep(3000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

        @Override
        public void declareOutputFields(OutputFieldsDeclarer outputFieldsDeclarer) {
            outputFieldsDeclarer.declare(new Fields("key"));
        }
    }

    static class FirstBolt extends BaseBasicBolt{


        @Override
        public void declareOutputFields(OutputFieldsDeclarer outputFieldsDeclarer) {
            outputFieldsDeclarer.declare(new Fields("key"));

        }

        @Override
        public void execute(Tuple tuple, BasicOutputCollector basicOutputCollector) {
            String key = tuple.getStringByField("key");
            System.out.println("get the key in FirstBolt:"+key);
            basicOutputCollector.emit(new Values(key));
            try {
                Thread.sleep(3000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    static class SecondBolt extends BaseBasicBolt{

        @Override
        public void execute(Tuple tuple, BasicOutputCollector basicOutputCollector) {
            String key = tuple.getStringByField("key");
            if(!key.contains("complete")){
                basicOutputCollector.emit("loop",new Values(key+" complete"));
            }
        }

        @Override
        public void declareOutputFields(OutputFieldsDeclarer outputFieldsDeclarer) {

            outputFieldsDeclarer.declareStream("loop",new Fields("key"));
        }
    }

    public static void main(String[] args){
        TopologyBuilder builder = new TopologyBuilder();
        builder.setSpout("spout", new SimpleSpout(), 1);
        builder.setBolt("firstBolt",new FirstBolt()).globalGrouping("spout").globalGrouping("secondBolt","loop");
        builder.setBolt("secondBolt",new SecondBolt()).globalGrouping("firstBolt");
        LocalCluster cluster = new LocalCluster();
        Config conf = new Config();
        cluster.submitTopology("LoopTopology", conf, builder.createTopology());
    }
}

运行结果

get the key in FirstBolt:A1 complete
get the key in FirstBolt:A2
get the key in FirstBolt:A2 complete
get the key in FirstBolt:A3
get the key in FirstBolt:A4
get the key in FirstBolt:A3 complete
get the key in FirstBolt:A5
get the key in FirstBolt:A4 complete
get the key in FirstBolt:A6
...
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值