4

MbGlobalMap在 IBM Integration Bus 的(嵌入式全局缓存)中存储了一些信息。如果调用了地图,EXAMPLE.MAP我可以按如下方式访问这些值:

MbGlobalMap map = MbGlobalMap.getGlobalMap("EXAMPLE.MAP");
Object value = map.get(key);

但我想获取 的所有值EXAMPLE.MAP,即使我不知道地图的所有键。我无法迭代,MbGlobalMap并且演员阵容java.util.Map根本不起作用。

这是该类的文档:https ://www.ibm.com/support/knowledgecenter/SSMKHH_9.0.0/com.ibm.etools.mft.plugin.doc/com/ibm/broker/plugin/MbGlobalMap.html 。没有提供方法来返回 Map 中的所有元素。

一种解决方法可能是一个包含所有当前键的列表,这样您就可以获取此列表,并使用它可以获取地图中的所有值。但我认为这不是一个干净的解决方案。

4

3 回答 3

5

经过一段时间的研究,我想自己回答这个问题:

解决方案是我在问题中提到的解决方法。您可以将 JavaHashMap放入全局缓存并将所有对象写入此 Map。示例如下所示:

MbGlobalMap globalMap = MbGlobalMap.getGlobalMap("EXAMPLE.MAP");
HashMap<String,Object> map = new HashMap<String,Object>();
// Put some objects into the map
globalMap.put("ALL", map);

现在您在全局缓存中拥有一个 Java HashMapMbGlobalMap您可以访问数据,而无需知道以下键:

MbGlobalMap globalMap = MbGlobalMap.getGlobalMap("EXAMPLE.MAP");
HashMap<String,Object> map = (HashMap<String,Object>)globalMap.get("ALL");
Set<String> allKeys = map.keySet();
Iterator<String> iter = allKeys.iterator();

while(iter.hasNext()) {
    // Do something with map.get(iter.next());
}

首先我想,这个解决方案不会是一个干净的解决方案,因为现在必须为每个写操作锁定 Map。但看起来,全局缓存无论如何都会为每个写操作锁定 Map:

正如 JAMESHART在 IBM developerWorks 上的贡献中提到的那样,Global Cache 下的 Extreme Scale Grid 配置了悲观锁定策略。根据IBM Knowledge Center 中的条目,这意味着以下内容:

悲观锁定:获取条目上的锁,然后持有锁直到提交时间。这种锁定策略以牺牲吞吐量为代价提供了良好的一致性。

因此,使用所描述的解决方法不会对写入访问和性能产生如此大的影响。

于 2016-09-21T19:51:21.233 回答
3

现在 IBM 的 Community RFE 网站上有一个增强请求,以获取此功能:

http://www.ibm.com/developerworks/rfe/execute?use_case=viewRfe&CR_ID=94875

如果您对此功能感兴趣,请为此请求投票,因为 IBM 会根据他们的投票来考虑 ER。

于 2016-09-21T22:30:48.810 回答
0

Arcdic ,使用 API 的最佳方法是使用 putAll 接受 java.util.Map ,然后使用 EntrySet 来获取您感兴趣的值。

public void putAll(Map m) 抛出 MbException

于 2016-08-26T14:44:17.480 回答