2016-08-26 1 views
3

Ich speichere einige Informationen in einem MbGlobalMap (eingebetteten globalen Cache) des IBM Integration Bus. Wenn die Karte genannt wird EXAMPLE.MAP kann ich die Werte wie folgt zugreifen:Wie bekomme ich alle Werte einer MbGlobalMap in den IIB Global Cache?

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

Aber ich möchte alle Werte der EXAMPLE.MAP bekommen, auch wenn ich nicht weiß, alle Schlüssel der Karte. Ich kann nicht über die MbGlobalMap iterieren und ein Cast zu java.util.Map wird überhaupt nicht funktionieren.

Dies ist die Dokumentation der Klasse: https://www.ibm.com/support/knowledgecenter/SSMKHH_9.0.0/com.ibm.etools.mft.plugin.doc/com/ibm/broker/plugin/MbGlobalMap.html. Es gibt keine Methode, alle Elemente innerhalb der Map zurückzugeben.

Eine Abhilfe könnte eine Liste mit allen aktuellen Schlüsseln darin sein, so dass Sie diese Liste bekommen können und damit Sie alle Werte innerhalb der Karte erhalten können. Aber das ist keine saubere Lösung, denke ich.

Antwort

3

nach einiger Zeit der Forschung, möchte ich von mir eine Antwort auf diese Frage geben:

die Lösung dieses Problem umgehen, ich in meiner Frage erwähnt. Sie können ein Java HashMap in den Global Cache schreiben und alle Ihre Objekte in diese Map schreiben. Ein Beispiel wäre etwa wie folgt aussehen:

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

Jetzt haben Sie eine Java HashMap innerhalb des MbGlobalMap des Global Cache und die Daten zugreifen können, ohne die Schlüssel zu wissen, wie folgt:

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()); 
} 

Zuerst dachte ich, diese Lösung wäre keine saubere, denn jetzt muss die Map für jede Schreiboperation gesperrt werden. Aber es scheint, dass die globale Cache wird die Karte für jeden Schreibvorgang sperrt trotzdem:

Als JAMESHART es bei seinem contribution at IBM developerWorks erwähnte, ist die Extreme Skala Gitter unter dem globalen Cache konfiguriert ist, mit pessimistischen Sperrstrategie. Gemäß der entry in the IBM Knowledge Center bedeutet dies folgendes:

Pessimistic Verriegelungs: akquiriert Sperren für Einträge, dann und hält die Sperren bis Festschreibungszeit. Diese Sperrstrategie bietet eine gute Konsistenz auf Kosten des Durchsatzes.

Die Verwendung der beschriebenen Problemumgehung wird also keinen so großen Einfluss auf Schreibzugriff und Leistung haben.

0

Arcdic, der beste Weg, mit der API zur Hand den putAll zu verwenden, die in einem java.util.Map nimmt, dann eine entrySet verwenden, um Werte zu erhalten, die Sie interessieren.

Öffentlichkeit nichtig putAll (Karte m) wirft MbException

+0

Danke für die schnelle Antwort. Die 'putAll()' -Funktion von 'MbGlobalMap' speichert kein Objekt von' java.util.Map' im globalen Cache sondern alle Einträge davon. "Fügt alle Einträge in der gelieferten Karte in diese Karte ein." (Quelle: [link] (https://www.ibm.com/support/knowledgecenter/SSKM8N_8.0.0/com.ibm.etools.mft.plugin .doc/com/ibm/broker/plugin/MbGlobalMap.html)) – Yannick

+0

Mein Fehler, ich musste die Frage erneut lesen. Der einzige Weg, an den ich denken konnte, war zu sehen, ob irgendwelche MQSI-Befehle verfügbar sind oder ob es REST-Endpunkte dafür gibt. Beide existieren nicht. Also wirst du hier etwas Brauchbares zusammenstellen müssen. –

+0

Ja, ein mqsi-Befehl zum Lesen sogar aller globalen Cache-Inhalte wäre großartig. Ich werde beweisen, ob es eine Auflösung auf extremer Gitterebene gibt. Ansonsten werde ich hier einen Workaround erstellen. – Yannick

3

Es gibt jetzt eine Erweiterung Anfrage auf IBMs Gemeinschaft RFE Website, um diese Funktion zu erhalten:

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

Bitte geben Sie Ihre Stimme für diese Anforderung, wenn Sie in dieser Funktion interessiert sind, weil IBM ERs hält based auf ihre Stimmen.

+0

Hey @thorstenhirsch, wo ist der RFE weg? Ich bekomme einen 500-Fehler von der Verbindung. – Yannick

+0

Muss bei IBM gestern ein temporäres Problem gewesen sein. Die Seite mit dem RFE ist wieder online. – thorstenhirsch

Verwandte Themen