【问题标题】:How to get access to TopologyContext within an abstract class如何在抽象类中访问 TopologyContext
【发布时间】:2017-04-13 21:43:54
【问题描述】:

我的目标是在整个拓扑中添加指标。在扩展 Base/Rich 螺栓类的螺栓上运行良好,但我无法在扩展以下 AbstractRedisBolt class 的螺栓内注册任何指标。

我正在尝试在扩展 AbstractRedisBolt 的螺栓中获取 TopologyContext。但是,该类的prepare 方法不会将拓扑上下文暴露给派生类。

我试图通过为上下文定义一个类属性 + 一个返回该属性的方法来扩展 AbstractRedisBolt 类,但这并没有真正奏效。我最终在我的 Bolt 中获得了对拓扑上下文的引用,但是 context.registerMetric 操作没有注册任何指标。

谢谢,

【问题讨论】:

    标签: java redis apache-storm jedis


    【解决方案1】:

    只需覆盖prepare(),包括对超类的调用:

    public class MyRedisBolt extends AbstractRedisBolt {
        private TopologyContext context = null;
    
        public void prepare(Map map, TopologyContext topologyContext, OutputCollector collector) {
            super.prepare(map, topologyContext, collector);
            this.context = topologContext;
        }
    }
    

    【讨论】:

    • 嗨,马蒂亚斯,感谢您的回复。我试图扩展 AbstractRedisBolt,现在我开始收到这条消息:java.lang.RuntimeException: TopologyContext.registerMetric can only be called from within overridden IBolt::prepare() or ISpout::open() method。另外,我仍然不确定我应该在哪里实例化 numEventsEnriched = new CountMetric(); 和 registerMetric 在子类中。我目前在execute 方法中执行此操作,因为prepare 方法不可用:super.context.registerMetric(ConfigTopology.METRICS_TOTAL_TO_ENRICH, numEventsEnriched, oneMin);
    • 你好,马蒂亚斯。太感谢了。我刚刚做了 RTFM,其中“M”代表消息;)确实,消息说明了一切。我只是在螺栓中重写了prepare 方法,在prepare 方法中声明并注册了度量,瞧!非常感谢先生!
    • 我喜欢 RTFM! ;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-09
    • 2019-01-18
    • 1970-01-01
    相关资源
    最近更新 更多