如何在同一个螺栓中处理不同的元组(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,它会在布尔值到达或字符串值到达时记录一些内容。

(简化的)拓扑如下所示:

    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 中的字段,有时值是布尔值,有时值是字符串,因为 BoolBolt 和 StringBolt 都会向 LoggerBolt 发出元组。

我该如何处理?

例如如果元组(“id”,“bool”)到达 LoggerBolt,我想打印“BOOL”,如果元组(“id”,“string”)到达记录器,我想打印“STRING”。

有没有可能检查元组是从什么粗体发出的?或者有什么我可以检查元组包含哪些字段的吗?

并且只是检查元组值是否为字符串不是我要找的,因为示例中的所有内容都可以发出!!!

提前致谢

您可以检查元组对象以找出它来自哪个组件。在您的 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") 完成的。两种方法都可以。