问题来源
初学Storm, 学习文档上定义Storm的Topology为一个有向无环图。 今天想到,如果Topology中有环又会如何? 所以用一段简单的代码进行了实验
结论
实验结论是,Topology是可以有环的
实验过程
定义拓扑
代码
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
...