簡體   English   中英

如何在同一個bolt中處理不同的元組(Storm)

[英]How to process different tuples in the same bolt (Storm)

我有 2 個風暴螺栓,它們發出不同的值(定義為 declareOutputFields)

1)

    declarer.declare(new Fields("id", "bool"));
    basicOutputCollector.emit(new Values(id, true));
    declarer.declare(new Fields("id", "string"));
    basicOutputCollector.emit(new Values(id, "somestring"));

我想要一個用作記錄器的 Bolt,如果 boolean 值到達或字符串值到達,它會記錄一些東西。

(簡化的)拓撲如下所示:

    var topologyBuilder = new TopologyBuilder();
    topologyBuilder.setSpout("spout")
    topologyBuilder.setBolt(BoolBolt, new BoolBolt()).fieldsGrouping("spout", new Fields("id"));
    topologyBuilder.setBolt(StringBolt, new StringBolt()).fieldsGrouping("spout", new Fields("id"));
    topologyBuilder.setBolt("LoggerBolt", new LoggerBolt())
            .fieldsGrouping("BoolBolt", new Fields("id"));
            .fieldsGrouping("StringBolt", new Fields("id"));
    return topologyBuilder.createTopology();

但如果我現在嘗試訪問 LoggerBolt 中的字段,有時值是 boolean,有時值是字符串,因為 BoolBolt 和 StringBolt 都向 LoggerBolt 發出元組。

我該如何處理?

例如,如果元組(“id”,“bool”)到達 LoggerBolt,我想打印“BOOL”,如果元組(“id”,“string”)到達記錄器,我想打印“STRING”。

有沒有可能檢查從哪個 Bold 發出了 Tuple ? 或者有什么我可以檢查元組包含的字段嗎?

並且只是檢查元組值是否是字符串不是我要尋找的,例如一切都可以發出!!!

提前致謝

您可以檢查元組 object 以找出它來自哪個組件。 在 LoggerBolt 中嘗試以下操作:

String from_bolt = tuple.getSourceComponent();
if ("BoolBolt".equals(from_bolt)) {
    LOG.info("BOOL");
} else if ("StringBolt".equals(from_bolt)) {
    LOG.info("STRING");
}

另一種方法是檢查元組是否包含某個字段,這是通過tuple.contains("field_name")完成的。 兩種方法都行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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