[英]Apache Storm Bolt cannot receive any Tuple from other Bolt emit
[英]Apache Storm (Java): Bolt not receiving tuple from other Bolt
我正在使用以下拓扑使用Apache Storm:
TopologyBuilder builder = new TopologyBuilder();
builder.setSpout("socketspout", new SocketSpout(IP_HOST,PORT));
builder.setBolt("filterone", new FilterOne()).shuffleGrouping("socketspout");
builder.setBolt("filtertwo", new FilterTwo()).shuffleGrouping("filterone");
第一个螺栓的方法是(FilteOne),此类扩展了BaseRichBolt:
public void declareOutputFields(OutputFieldsDeclarer declarer) {
declarer.declare(new Fields("ID1","signal1"));
}
public void execute(Tuple input) {
int sig;
try {
sig=input.getInteger(1)*2;
System.out.println("Filter one.."+Integer.toString(sig));
collector.emit("ack1", new Values(input.getString(0), sig));
collector.ack(input);
} catch (Exception e) {
collector.fail(input);
}
}
第二个螺栓的方法是(FilteTwo),该类也扩展了BaseRichBolt:
public void declareOutputFields(OutputFieldsDeclarer declarer) {
}
public void execute(Tuple input) {
int sig;
try {
sig=input.getInteger(1)+1;
System.out.println("Filter two.."+Integer.toString(sig));
collector.ack(input);
} catch (Exception e) {
collector.fail(input);
}
}
当执行程序模式localcluster时,我可以看到第一个螺栓发出了元组,但是第二个螺栓从未收到该元组……
解决了该问题,修改了来自collector.emit("ack1", new Values(input.getString(0), sig));
的过滤器代码collector.emit("ack1", new Values(input.getString(0), sig));
到collector.emit( new Values(input.getString(0), sig));
该方法的发射器的收集器可以像这样设置:
collector.emit(input, new Values(input.getString(0), sig));
不要忘记在方法clarifyOutputFields中为此字段设置字段名称:
public void declareOutputFields(OutputFieldsDeclarer declarer) {
declarer.declare(new Fields("myValue"));
}
然后,在第二个螺栓中,尝试使用“ myValue”字段获取值:
sig = input.getValueByField("myValue").getInteger(1)+1;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.