当前位置: 首页 > 知识库问答 >
问题:

更新锁定范围内的映射时,Hazelcast ILock不在群集中工作

诸葛令
2023-03-14

我有一个具有2个节点(即2个JVM)的集群环境。我正在尝试检查Hazelcast ILock中的Hazelcast IMap是否存在密钥,如下所示:解决方案1:

public static final String CUR_ACC_MAP = "CUR_ACC_MAP";
private static final HazelcastInstance hazelInstance = Hazelcast.getHazelcastInstanceByName("accountCache");

public static boolean currencyAccountCreationInPorgress(String key) {
    ILock lock = hazelInstance.getLock(CUR_ACC_MAP);
    lock.lock();
    try {
        IMap<Object, Object> map = hazelInstance.getMap(CUR_ACC_MAP);
        if (!map.containsKey(key)) {
            map.putIfAbsent(key, System.currentTimeMillis());
            return false;
        }
        return true;
    } finally {
        lock.unlock();
    }
}

但问题是,当在两个节点中同时调用请求时,两个节点都会进入if条件[if(!map.containsKey(key)){…}]。因此,集群中的两个节点都会从上述方法返回false。我在做什么?

我最初尝试了以下代码,但也不起作用,所以我切换到上面的SOLUTION 1,但也不起作用。

解决方案2:

public static final String CUR_ACC_MAP = "CUR_ACC_MAP";
private static final HazelcastInstance hazelInstance = Hazelcast.getHazelcastInstanceByName("accountCache");

public static boolean currencyAccountCreationInPorgress(String key) {
    IMap<Object, Object> map = hazelInstance.getMap(CUR_ACC_MAP);
    map.lock(CUR_ACC_MAP);
    try {
        if (!map.containsKey(key)) {
            map.putIfAbsent(key, System.currentTimeMillis());
            return false;
        }
        return true;
    } finally {
        map.unlock(CUR_ACC_MAP);
    }
}

这是我的Hazelcast配置:

    <hz:hazelcast id="hzInstance">
    <hz:config>
        <hz:instance-name>accountCache</hz:instance-name>
        <hz:group name="hzAcc" password="Vam123" />
        <hz:network port="${account.hazelcast.port}" port-auto-increment="true">
            <hz:join>
                <hz:multicast enabled="false" />
                <hz:tcp-ip enabled="${account.hazelcast.join.tcpip.enabled}">
                    <hz:members>${account.hazelcast.members}</hz:members>
                </hz:tcp-ip>
            </hz:join>
        </hz:network>

        <!-- Account File Upload Concurrent Processing Maps -->
        <hz:map name="CUR_ACC_MAP" max-idle-seconds="60" eviction-policy="LRU" max-size="100000" />

共有2个答案

奚曦哲
2023-03-14

如果需要锁定hazalcast实例,请这样使用。看起来您正在尝试锁定实例名称。请使用实例对象。它会起作用的

Config cfg = new Config();
HazelcastInstance hz = Hazelcast.newHazelcastInstance(cfg);
Lock lock = hz.getLock(object_to_lock);
lock.lock();
try {
        IMap<Object, Object> map = hazelInstance.getMap(CUR_ACC_MAP);
        if (!map.containsKey(key)) {
            map.putIfAbsent(key, System.currentTimeMillis());
            return false;
        }
        return true;
    } finally {
        lock.unlock();
    }
祖利
2023-03-14

@拉吉布,

  • 在解决方案2中,尝试使用映射。锁(钥匙)相反,即使没有钥匙可以锁,它也应该可以工作
  • 在解决方案1中,如果您的两个成员都是同一个Hazelcast集群的一部分,那么只有其中一个成员应该访问if块,而不是同时访问这两个块
  • 没有锁的更好解决方案是:
public static boolean currencyAccountCreationInPorgress(String key) {
    return hazelInstance.getMap(CUR_ACC_MAP).putIfAbsent(key, System.currentTimeMillis()) != null;
}

putIfAbsent操作是原子操作,因此只能成功完成一次,所有其他请求将只返回上一个值,因此您的方法将只返回true。

 类似资料:
  • 我有一张按天索引的工作班次图

  • 问题内容: 抱歉,是否曾有人问过这个问题,但我进行了广泛调查,没有结果。 我想创建一个新列,该列根据某些规则映射的多个值,例如a = [1,2,3]为1,a = [4,5,6,7]为2,a = [8 ,9,10]为3。一对一映射对我来说很清楚,但是如果我想按值列表或范围进行映射怎么办? 我遵循这些原则… 问题答案: 有几种选择。 熊猫通过/ NumPy通过 NumPy通过 的元素是布尔级数,因此对

  • 问题内容: 我尝试编写一个小指令,以将其内容包装在另一个模板文件中。 这段代码: 应该有以下输出: 因为布局“默认”具有以下代码: 这里的指令代码: }); 我的问题: 例如,当我在模板(在布局模板中或在布局标签内部)中使用范围变量时。它只是最初工作。如果我更新变量,则该指令不再更新。整个链接功能只会被触发一次。 我认为,AngularJS不知道,该指令使用范围变量,因此不会被更新。但是我不知道如

  • 问题内容: 我有一个带有id列和成千上万行的表。我获得了1000个ID的列表,用于对照其他表格数据进行检查。 ID没有按顺序存储。 ID列表也不按顺序排列。 当我使用这些ID选择表格数据时,仅返回990个结果,这意味着自该列表产生以来,其中10个结果已更改/被删除。如何从该数据范围中找到10个缺失值?这是我目前正在做的事情: 返回990个结果。我可以做类似的事情吗? 编辑:抱歉造成混乱。我应该提到

  • 问题内容: 我正在寻找一种确定范围的方法 。 Golang规范指出以下内容: 未指定地图的迭代顺序,并且不能保证每次迭代之间都相同。如果在迭代过程中删除尚未到达的映射条目,则不会生成相应的迭代值。如果映射条目是在迭代过程中创建的,则该条目可能在迭代过程中产生或可以被跳过。对于创建的每个条目以及从一个迭代到下一个迭代,选择可能有所不同。如果映射为nil,则迭代次数为0。 我在StackOverflo

  • 对于我的Java类,我正在编写一个小程序,首先选择一个介于1和100之间的数字。然后,它会提示用户开始猜测正确的。如果用户对的猜测过高或过低,程序会打印出一个新范围,供他们在该范围内进行猜测。如果用户输入或,程序只需重新要求用户输入,但不会以任何方式更改范围。 示例输出(当机密号为20时)如下所示: 该项目似乎已经基本完成,但只有一个例外。其中一个要求是,当用户键入的超出我们给定的1和100范围时