【问题标题】:Get a value from a map once it is filled with Hazelcast用 Hazelcast 填充地图后,从地图中获取一个值
【发布时间】:2016-04-25 20:11:44
【问题描述】:

我是 Hazelcast 的新手,在我看来,我正在努力解决一个非常简单的问题,但无法解决它。

我有这种情况,我有 2 个 web 服务,在一个服务器(第一个 API)中,我必须使用第二个 API 从不同的服务器获取一个将在 5 秒后填充的值,并且我只有一个 referenceId在两个服务器之间识别/获取/填充值。换句话说,当我的第一个 Api 使用 ID 调用时,它将返回推送到具有该 ID 的第二个 Api 的内容。

此图更好地显示了我想通过连接第一个和第二个 API 来解决的问题:

所以,我使用了 IMap 并像这样执行“获取”和“放置”:

//- First API -//
Integer referenceId = XXXX; // coming in the step 2
IMap<Integer, String> map = hazelcastInstance.getMap("ResponseMap");

Thread.sleep(5000); // Sleep here does the trick but it's the worst performance
String strResponse = map.get(referenceId);

另一方面,另一台服务器将在最多 5 秒后将数据放入,如下所示:

//- Second API -//
String refId = captureRefId(YYYY)
IMap<Integer, String> map = hazelcastInstance.getMap("ResponseMap");
map.put(refId, YYYY);

问题在于 map.get 总是返回 null,因为此时该值不存在,但是如果我添加 sleep(5) 一切正常。

我的问题是,我该怎么做才能阻止 map.get(referenceId) 直到其他服务器使用该特定 ID 填充地图?还有比使用 IMap 更好的选择吗?

【问题讨论】:

  • 轮询循环不会有几毫秒的等待时间来解决问题吗?不确定我是否完全理解您的问题/问题。 IMap 没有这样的阻塞操作,也许 IQueue 会更好地解决它,但这取决于您真正想要实现的目标。也许您可以进一步详细说明。
  • @noctarius 感谢您的评论。我用图表更新了我的问题。它更好地显示了我的问题,我想让1st API 等待2nd API 被执行并填充数据。
  • 仍然,轮询不能解决问题吗?作为替代方案,地图侦听器?
  • @noctarius 我对 HZ 很陌生,所以从来没有使用过轮询或地图监听器。你能给我指个样本吗?或者实际上有答案?顺便说一句,轮询是指 IQueue 吗?我正在调查地图侦听器,但没有找到如何通过参考 ID 连接数据(请记住,第二个 API 存在于多个服务器中

标签: java hazelcast hazelcast-imap


【解决方案1】:

正如@noctarius 提到的,如果您一定要使用 IMap,EntryListener 将是最好的方法。下面是一个 EntryListener 如何工作的示例。

https://github.com/hazelcast/hazelcast-code-samples/blob/master/distributed-map/entry-listener/src/main/java/ListeningMember.java

您订阅并在添加条目时收到通知。然后你就可以触发你的逻辑了。

【讨论】:

  • 您有机会评估答案吗?如前所述,使用 IMap 是唯一的方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-06
  • 2019-03-29
  • 1970-01-01
相关资源
最近更新 更多