我有一个由两个 hazelcast 实例组成的集群。当我使用执行程序服务并将任务发送给 key 所有者时, key 是新的(意味着现在没有映射包含此 key ,但在“调用”之后),然后我的可调用对象将分发到每个节点。
instance.getExecutorService("default")
.submitToKeyOwner(callable, newTargetColumn);
出于调试目的,我实现了一个只记录事件的 EntryListener。在那里您可以看到两个实例都在做完全相同的事情。
hz._hzInstance_2_dev.cached.thread-3 TRACE datastore.WorkmapDebugListener - entry added: EntryEvent {worker-map::to be defined} key=high, oldValue=null, value=[1.04, 1.01, 0.98, 0.9, 0.86, 0.83, 0.83, 0.85, 0.92, 0.91, 0.47, 0.49, 0.48, 0.49, 0.48, 0.42, 0.52, 0.56, 0.55, 0.52, 0.53, 0.51, 0.47, 0.49, 0.4, 0.41, 0.39, 0.37, 0.38, 0.37, 0.41, 0.36, 0.38, 0.33, 0.3, 0.31, 0.32], event=ADDED, by Member [192.168.1.157]:5802 this
hz._hzInstance_1_dev.cached.thread-3 TRACE datastore.WorkmapDebugListener - entry added: EntryEvent {worker-map::to be defined} key=high, oldValue=null, value=[1.04, 1.01, 0.98, 0.9, 0.86, 0.83, 0.83, 0.85, 0.92, 0.91, 0.47, 0.49, 0.48, 0.49, 0.48, 0.42, 0.52, 0.56, 0.55, 0.52, 0.53, 0.51, 0.47, 0.49, 0.4, 0.41, 0.39, 0.37, 0.38, 0.37, 0.41, 0.36, 0.38, 0.33, 0.3, 0.31, 0.32], event=ADDED, by Member [192.168.1.157]:5802
难道不能提前获得节点吗?我的意思是因为无论如何都会根据映射键计算分区?
我可以向可能保存数据的节点发送一个可调用对象吗?
最佳答案
'submitToKeyOwner' 意味着我们计算该 key 的哈希值并根据该哈希值找到正确的成员。成员是否真的拥有该 key 并不重要。检查 key 是否存在也没有意义,因为我们应该检查哪个 map ?也许一张 map 有 key 而另一张 map 没有。因此,不依赖于 key 的存在以及用于将该任务发送给成员的路由机制。
这里错误的解释是日志记录(我也被放在错误的脚上)。如果你在 member-a 上的某个映射中插入一个键,并且 member-a 和 member-b 在该映射上有一个条目监听器注册,他们都会收到一个事件,表明一个条目被添加到 member-a 上;甚至成员-b。
如果您有任何问题,请随时提出。您的代码应该可以正常工作。
关于java - 将可调用对象发送到将保存 future 数据的 hazelcast 节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28028524/