【问题标题】:How to check if a field is sent by a spout or by a bolt?如何检查字段是由 spout 还是由 bolt 发送的?
【发布时间】:2016-05-18 05:47:22
【问题描述】:

我正在使用 apachestorm,并试图确保一个字段是否由 spout(我有很多)创建并由 bolts 发送。这个想法只是跟进它的定义位置然后摆脱它。

所以在我的喷口中,我已经覆盖了

emit(List<Object> tuple, Object messageId)

为了增加一个计数器的方法,我的问题是我需要访问字段的名称。

如何访问由

定义的名称
public void declareOutputFields(OutputFieldsDeclarer declarer) {
    declarer.declare(new Fields("test"));
}

在同一个 spout/bolt 中的方法?

我相信这很简单,但我在文档中找不到。

【问题讨论】:

    标签: java apache-storm


    【解决方案1】:

    我不确定是否完全理解您的问题。然而,Storm 没有提供任何机制来访问同一个 Spout/Bolt 中的 Spout/Bolt 的声明输出字段。我真的不明白你为什么需要这个?如果你实现了 Spout/Bolt,你实际上知道声明了哪个字段......

    当然,您可以实现自己的OutputFieldsDeclarer 并调用this.declareOutputFields(myDeclarer) 并将声明的字段存储在myDeclarer 中以便以后“访问”它们。

    【讨论】:

      【解决方案2】:

      创建拓扑时,您将为每个 spout 和 bolts 命名。所以当你在执行方法中从 spout 或 bolt 收到任何元组时,调用

      input.getSourceComponent();
      

      这将返回组件的名称,您可以轻松识别 spout 或 bolt。

      如何访问已定义的名称

      要访问字段的名称,您可以说

      tuple.getValueByField("test"));
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-10-18
        • 2018-01-22
        • 1970-01-01
        • 2013-09-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-09-03
        相关资源
        最近更新 更多