Apache storm 在此风暴拓扑中未接收到ack?
我是新的风暴,我正在运行一个主题Apache storm 在此风暴拓扑中未接收到ack?,apache-storm,Apache Storm,我是新的风暴,我正在运行一个主题 public class FakeCallLogReaderSpout implements IRichSpout { //Create instance for SpoutOutputCollector which passes tuples to bolt. private SpoutOutputCollector collector; private boolean completed = false; //Create inst
public class FakeCallLogReaderSpout implements IRichSpout {
//Create instance for SpoutOutputCollector which passes tuples to bolt.
private SpoutOutputCollector collector;
private boolean completed = false;
//Create instance for TopologyContext which contains topology data.
private TopologyContext context;
//Create instance for Random class.
private Random randomGenerator = new Random();
private Integer idx = 0;
@Override
public void open(Map conf, TopologyContext context, SpoutOutputCollector collector) {
this.context = context;
this.collector = collector;
}
@Override
public void nextTuple() {
if(this.idx <= 1000) {
List<String> mobileNumbers = new ArrayList<String>();
mobileNumbers.add("1234123401");
mobileNumbers.add("1234123402");
mobileNumbers.add("1234123403");
mobileNumbers.add("1234123404");
Integer localIdx = 0;
while(localIdx++ < 100 && this.idx++ < 1000) {
String fromMobileNumber = mobileNumbers.get(randomGenerator.nextInt(4));
String toMobileNumber = mobileNumbers.get(randomGenerator.nextInt(4));
while(fromMobileNumber == toMobileNumber) {
toMobileNumber = mobileNumbers.get(randomGenerator.nextInt(4));
}
Integer duration = randomGenerator.nextInt(60);
this.collector.emit(new Values(fromMobileNumber, toMobileNumber, duration),duration);
}
}
}
@Override
public void declareOutputFields(OutputFieldsDeclarer declarer) {
declarer.declare(new Fields("from", "to", "duration"));
}
//Override all the interface methods
@Override
public void close() {}
public boolean isDistributed() {
return false;
}
@Override
public void activate() {}
@Override
public void deactivate() {}
@Override
public void ack(Object msgId) {
System.out.println(msgId);
}
@Override
public void fail(Object msgId) {}
@Override
public Map<String, Object> getComponentConfiguration() {
return null;
}
}
public类FakeCallLogReaderSpout实现IRichSpout{
//为将元组传递给bolt的SpoutOutCollector创建实例。
私人管道出口收集器;
private boolean completed=false;
//为包含拓扑数据的TopologyContext创建实例。
私有拓扑上下文;
//创建随机类的实例。
私有随机生成器=新随机();
私有整数idx=0;
@凌驾
公共void打开(地图配置、拓扑上下文上下文、喷口输出收集器){
this.context=上下文;
this.collector=收集器;
}
@凌驾
public void nextTuple(){
如果(this.idx您需要在每个螺栓中锚定和确认元组。我猜您的拓扑结构类似于FakeCallLogReaderSpout
=>CallLogCreatorBolt
=>CallLogCounterBolt
。因此,在CallLogCreatorBolt
中您应该这样做
collector.emit(tuple, new Values(from + " - " + to, duration));
collector.ack();
有关更多详细信息,请阅读。可能重复的
public class CallLogCounterBolt implements IRichBolt {
Map<String, Integer> counterMap;
private OutputCollector collector;
@Override
public void prepare(Map conf, TopologyContext context, OutputCollector collector) {
this.counterMap = new HashMap<String, Integer>();
this.collector = collector;
}
@Override
public void execute(Tuple tuple) {
String call = tuple.getString(0);
Integer duration = tuple.getInteger(1);
if(!counterMap.containsKey(call)){
counterMap.put(call, 1);
}else{
Integer c = counterMap.get(call) + 1;
counterMap.put(call, c);
}
collector.ack(tuple);
}
@Override
public void cleanup() {
for(Map.Entry<String, Integer> entry:counterMap.entrySet()){
System.out.println(entry.getKey()+" : " + entry.getValue());
}
}
@Override
public void declareOutputFields(OutputFieldsDeclarer declarer) {
declarer.declare(new Fields("call"));
}
@Override
public Map<String, Object> getComponentConfiguration() {
return null;
}
}
collector.emit(tuple, new Values(from + " - " + to, duration));
collector.ack();