如何获取 IIB 全局缓存中 MbGlobalMap 的所有值?

How to get all values of a MbGlobalMap inside the IIB Global Cache?

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

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

但我想获取 EXAMPLE.MAP 的所有值,即使我不知道地图的所有键。我无法遍历 MbGlobalMap 并且强制转换为 java.util.Map 根本不起作用。

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

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

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

public void putAll(Map m) throws MbException

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

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

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

现在你在全局缓存的 MbGlobalMap 中有一个 Java HashMap 并且你可以访问数据,而无需知道密钥如下:

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。但似乎,全局缓存无论如何都会为每个写操作锁定映射:

正如 JAMESHART 在他的 contribution at IBM developerWorks, the Extreme Scale Grid under the Global Cache is configured with pessimistic locking strategy. According to the entry in the IBM Knowledge Center 中提到的那样,这意味着:

Pessimistic locking: Acquires locks on entries, then and holds the locks until commit time. This locking strategy provides good consistency at the expense of throughput.

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

现在 IBM 的社区 RFE 网站上有增强请求以获得此功能:

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

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