java - 在 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
解决方案
我在 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。
推荐阅读
- reactjs - 使用可拖动按钮调整图像大小 - React Native
- build.gradle - 错误:实现 'com.android.support:design:27.1.1'
- postgresql - Gridsome 构建在 graphql 查询上失败
- laravel - 使用急切加载 laravel 返回用户模型
- php - 如何在 WooCommerce 中为正常价格和促销价格添加后缀?
- talend - 如何从 Talend 中的 txt 文件中提取模式
- streamreader - 如果数据以 '\r' 结尾,StreamReader.ReadLineAsync() 将无限期等待
- java - Java - Hibernate 环境在 Jar 中不起作用
- entity-framework-core - MVC,.NET 5.0 - 如何根据数据库值过滤索引/创建页面?
- php - PHP/Laravel 基于日期的 ID - 如何使其防水?