Apache Storm(Java):Bolt没有从其他Bolt接收元组

时间:2017-07-25 21:40:38

标签: java apache apache-storm

我正在使用这种拓扑结构与Apache Storm合作:

c = imfuse(A, B, 'falsecolor', 'Scaling', 'joint', 'ColorChannels', 'red-cyan');

第一个bolt的方法是(FilteOne),这个类扩展了BaseRichBolt:

 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");

第二个螺栓的方法是(FilteTwo),这个类也扩展了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);
    }
}

当执行程序模式localcluster时,我可以看到第一个螺栓发出元组,但第二个螺栓从未接收到元组......

enter image description here

2 个答案:

答案 0 :(得分:0)

问题解决了从collector.emit("ack1", new Values(input.getString(0), sig));修改过滤器的一个代码 到collector.emit( new Values(input.getString(0), sig));

答案 1 :(得分:0)

方法emit的收集器可以设置为:

collector.emit(input, new Values(input.getString(0), sig));

不要忘记在方法declareOutputFields:

中设置此值的字段名称
public void declareOutputFields(OutputFieldsDeclarer declarer) {
        declarer.declare(new Fields("myValue"));
    }

然后,在第二个螺栓中,尝试使用“myValue”字段获取值:

sig = input.getValueByField("myValue").getInteger(1)+1;