我有一种情况,我只需要加载一次提供者列表。所以我使用了同步块。但是在weblogic的多集群环境下,该算法失败了。有没有办法解决这个问题。这段代码在单个集群中工作得很好。
public class AdditionalInfoImplProvider
{
private volatile boolean isLoaded = false;
private void ensureProviderLoaded()
{
if (!isLoaded) {
synchronized (this) {
if (!isLoaded) {
// Load Provider
isLoaded = true;
}
}
}
}
}发布于 2018-05-24 18:51:44
Java关键字是一个单独的synchronized概念。在集群中,有多个JVM,所以所有这些都将在不同的AdditionalInfoImplProvider实例上同步,并且您的逻辑将在所有Weblogic实例中执行。
据我所知,标准JDK中没有提供这种同步。
Singleton设计模式在这里也不起作用,因为传统上,Singleton意味着每个JVM而不是每个集群的Singleton。
处理这种情况的基本方法是拥有应用程序外部的东西,比如锁文件或RDBMS中的条目&无论谁先获得它,加载和rest只需退出即可。
您还可以查看Weblogic是否为应用程序事件提供了某种类型的侦听器--而不是特定于集群实例。
我没有使用过Zookeeper,但听说人们在你的用例中使用它。
有关该主题的更广泛讨论,请参阅this question。
总结一下,您肯定需要在应用程序范围内存在一些东西,而每个JVM构造是不够的。
发布于 2018-05-24 19:13:57
WebLogic有一个您应该实现的特定接口- https://docs.oracle.com/cd/E68505_01/wls/WLAPI/weblogic/cluster/singleton/SingletonService.html -当您运行"activate“方法时,当另一个实例已经在您的WebLogic集群中处于活动状态时,它将抛出一个异常。
https://stackoverflow.com/questions/49730680
复制相似问题