在bolt的构造函数中初始化为null的变量

时间:2019-09-17 06:45:53

标签: java apache-storm

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

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

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

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

使用Storm版本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才能保留值

“要自定义螺栓,您应该在其构造函数中设置参数并将其保存为实例变量,以便在将螺栓提交给集群时将其序列化”

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

1 个答案:

答案 0 :(得分:0)

我在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。