簡體   English   中英

Apache Storm(Java):Bolt未從其他Bolt接收元組

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM