gpt4 book ai didi

java - Hazelcast EntryProcessor 的正确使用

转载 作者:行者123 更新时间:2023-12-01 17:55:33 26 4
gpt4 key购买 nike

我们正在尝试找出在不使用悲观锁定的情况下使用 Hazelcast 的 IMap 的最佳方法。

EntryProcessor 似乎是正确的选择,但是我们需要应用两种不同类型的操作:当 containsKey 为 false 时“创建”,以及当 containsKey 为 true 时“更新”。

如何利用 EntryProcessor 来支持这些逻辑检查?

如果两个线程同时命中 containsKey() 并且它返回 false 给它们,我不希望它们都创建 key 。我希望第二个线程应用更新。

这是我们目前所拥有的:

public void put(String key, Object value) {

IMap<String, Object> map = getMap();

if (!map.containsKey(key)) {
// create key here
} else {
// update existing value here
// ...
map.executeOnKey(key, new TransactionEntryProcessor({my_new_value}));
}
}

private static class MyEntryProcessor implements
EntryProcessor<String, Object>, EntryBackupProcessor<String, Object>, Serializable {

private static final long serialVersionUID = // blah blah

private static final ThreadLocal<Object> entryToSet = new ThreadLocal<>();

MyEntryProcessor(Object entryToSet) {
MyEntryProcessor.entryToSet.set(entryToSet);
}

@Override
public Object process(Map.Entry<String, Object> entry) {
entry.setValue(entryToSet.get());
return entry.getValue();
}

@Override
public EntryBackupProcessor<String, Object> getBackupProcessor() {
return MyEntryProcessor.this;
}

@Override
public void processBackup(Map.Entry<String, Object> entry) {
entry.setValue(entryToSet.get());
}
}

可以看到两个线程可以同时进入put方法并调用containsKey。第二个将覆盖第一个的结果。

最佳答案

EntryProcessor 根据定义是在条目本身上执行的处理逻辑,消除了序列化/反序列化值的需要。在内部,EP 由分区线程执行,其中一个分区线程负责多个分区。当EP到达HC时,它被 key 所属分区的所有者线程挑选。一旦处理完成,分区线程就准备好接受并执行其他任务(很可能是由另一个线程提交的相同键的相同 EP)。因此,看起来似乎如此,但 EP 不应该用作悲观锁定的替代品。

如果您坚持并真正热衷于使用 EP 来实现此目的,那么您可以尝试在 process 方法中放置 null 检查。像这样的事情:

    public Object process(Map.Entry<String, Object> entry) {
if(null == entry.getValue()) {
entry.setValue("value123");
}
return entry.getValue();
}

这样会发生两件事:1.另一个线程将等待分区线程再次可用2. 由于该值已经存在,因此您不会覆盖任何内容

关于java - Hazelcast EntryProcessor 的正确使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45237493/

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