如何获取 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。
我将一些信息存储在 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。