首页 > 解决方案 > 在 Bolt 的构造函数中初始化的变量为 null

问题描述

尝试通过使用实例变量并在构造函数中初始化它们来创建自定义螺栓。

不确定为什么提交拓扑时这些值显示为空。

如果我尝试将这些变量标记为“最终”,则值将被保留,否则不会。

所有使用的参考/变量都是可序列化的。

使用风暴版本 1.0.2

private static final long serialVersionUID = -1243523331733334733L;
String configPrefix;
OutputCollector collector;
ObjectMapper mapper;


public KafkaPushBolt(String configPrefix) {
    this.configPrefix = configPrefix;
}

...在@prepare 方法中,configPrefix 的值为 null,如果声明为“final”,则它可以工作

在文档中没有提到必须将变量声明为 final 以保持值

'要自定义一个bolt,你应该在它的构造函数中设置参数并将它们保存为实例变量,以便在将bolt提交到集群时将它们序列化'

如果我们使用参数化构造函数对其进行初始化,期望值不应为 null

标签: javaapache-storm

解决方案


我在 Storm 2.2.0 的最新快照上对此进行了尝试,但没有看到这种行为。

这是我的螺栓:

public static class ExclamationBolt extends BaseRichBolt {
        private String someString;
        OutputCollector collector;

        public ExclamationBolt(String someString) {
            this.someString = someString;
        }



        @Override
        public void prepare(Map<String, Object> conf, TopologyContext context, OutputCollector collector) {
            this.collector = collector;
        }

        @Override
        public void execute(Tuple tuple) {
            LoggerFactory.getLogger(getClass()).info("The string is {}", someString);
        }

    }

打印“字符串就是世界”

如果在 1.x 中只传输最终字段,那不是故意的。考虑升级到 2.x。


推荐阅读