我有一个具有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" />
如果需要锁定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();
}
@拉吉布,
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范围时