【问题标题】:How to get all values of a MbGlobalMap inside the IIB Global Cache?如何在 IIB 全局缓存中获取 MbGlobalMap 的所有值?
【发布时间】:2016-09-22 06:30:48
【问题描述】:

我将一些信息存储在 IBM Integration Bus 的 MbGlobalMap(嵌入式全局缓存)中。如果地图名为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 中的所有元素。

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

【问题讨论】:

    标签: java ibm-integration-bus


    【解决方案1】:

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

    解决方案是我在问题中提到的解决方法。您可以将 Java HashMap 放入全局缓存并将所有对象写入此 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);
    

    现在您在全局缓存的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 中提到的那样,全局缓存下的 Extreme Scale Grid 配置了 悲观锁定策略。根据entry in the IBM Knowledge Center,这意味着:

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

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • 嘿@thorstenhirsch,RFE 去哪儿了?我从链接中收到 500 错误。
      • 昨天一定是 IBM 的一个临时问题。带有 RFE 的页面重新上线。
      【解决方案3】:

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

      public void putAll(Map m) 抛出 MbException

      【讨论】:

      • 感谢您的快速回答。 MbGlobalMapputAll() 函数不会将 java.util.Map 的对象存储到全局缓存中,而是将其所有条目存储到全局缓存中。 "将提供的 Map 中的所有条目放入此映射中。"(来源:link
      • 我的错,我不得不重新阅读这个问题。我能想到的唯一方法是查看是否有任何 MQSI 命令可用,或者是否有 REST 端点。两者都不存在。所以我猜你必须在这里整理一些自定义的东西。
      • 是的,一个用于读取所有全局缓存内容的 mqsi 命令会很棒。我会证明在极端规模的网格水平上是否存在灵魂。否则我会在这里建立一个解决方法。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-10
      • 1970-01-01
      • 2015-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多