gpt4 book ai didi

java - Storm 拓扑中的单例模式

转载 作者:行者123 更新时间:2023-11-30 07:01:05 24 4
gpt4 key购买 nike

我写了一个storm topology,并将它的workers number设置为1。所以,我认为它的所有组件都应该在同一个进程中运行。我想在拓扑中的多个组件之间共享一个公共(public)对象,所以我使用单例模式:1,当独特的喷口打开时,我初始化单例对象。2、然后,我通过调用函数getInstance()在其他组件中使用单例对象。

但是,我发现我会在不同的组件之间获取不同的对象。

感谢您的回复。问题的关键代码如下:单例类代码:

public class TraceApplicationContext {
private volatile static TraceApplicationContext instance = new TraceApplicationContext();
private TraceApplicationContext() {

}
public static TraceApplicationContext getInstance() {
return instance;
}
}

SpoutA 类代码:

public class SpoutA extends BaseRichSpout {
public void open(Map map, TopologyContext topologyContext, SpoutOutputCollector spoutOutputCollector) {
TraceApplicationContext.getInstance().init();
}
}

BoltA 代码:

public class BoltA extends BaseRichBolt {
private static JedisCluster jedisCluster = TraceApplicationContext.getInstance().getJedisCluster();
}

BoltB 代码:

public class BoltB extends BaseRichBolt {
private static JedisCluster jedisCluster = TraceApplicationContext.getInstance().getJedisCluster();
}

在 SpoutA 中初始化 TraceApplicationContext 单例对象后,我检查了 TraceApplicationContext.getInstance().getJedisCluster() 返回的对象,它不是 null。但是我在BoltA和BoltB中查看,TraceApplicationContext.getInstance().getJedisCluster()返回的对象为null。

有没有人遇到过同样的问题或者知道这个问题出了什么问题?

求助!谢谢!

最佳答案

如果您不能像@Jorge_B 所说的那样使用枚举,您可以在getInstance() 方法中使用同步块(synchronized block)

public class MySingleton {
private static volatile MySingleton instance;
private MySingleton() { ... }
public static MySingleton getInstance() {
if (instance == null) {
synchronized(MySingleton.class) {
if (instance == null) {
instance = new MySingleton();
}
}
}
return instance;
}
}

http://en.wikipedia.org/wiki/Singleton_pattern


编辑

但这可能不是单例问题

getJedisCluster() 返回不同值的事实并不意味着它不是同一个单例,而是单例的状态发生了变化

尝试使 jedisCluster 在单例中成为 final(final 属性无法更改,但必须在构造函数中初始化)

private final JedisCluster jedisCluster;

如果您无法尝试跟踪 jedisCluster 何时更改:使用 setter...

关于java - Storm 拓扑中的单例模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30071975/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com