![](/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.