Java 在螺栓和x27中初始化的变量;s构造函数将显示为null

Java 在螺栓和x27中初始化的变量;s构造函数将显示为null,java,apache-storm,Java,Apache Storm,尝试通过使用实例变量并在构造函数中初始化它们来创建自定义螺栓 不确定提交拓扑时值为何显示为null 如果我尝试将这些变量标记为“final”,则值将被持久化,否则不会持久化 使用的所有ref/变量都是可序列化的 使用storm版本1.0.2 private static final long serialVersionUID = -1243523331733334733L; String configPrefix; OutputCollector collector; ObjectMapper

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

不确定提交拓扑时值为何显示为null

如果我尝试将这些变量标记为“final”,则值将被持久化,否则不会持久化

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

使用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才能持久化值

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


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

我在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);
        }

    }
public静态类感叹词bolt扩展了BaseRichBolt{
私有字符串someString;
输出采集器;
公共感叹号螺栓(字符串someString){
this.someString=someString;
}
@凌驾
public void prepare(地图配置、拓扑上下文、OutputCollector){
this.collector=收集器;
}
@凌驾
公共void执行(元组){
getLogger(getClass()).info(“字符串是{}”,someString);
}
}
打印“字符串就是世界”

如果在1.x中只传输最后一个字段,这不是有意的。考虑升级到2。