![](/img/trans.png)
[英]Sent different tuples from 1 spout to different bolt in Apache 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.