2014-08-29 9 views
6

Ich verwende Hazelcast als eine geteilte Karte in meiner Anwendung. Meine Karte ist wie folgt aus:Hazelcast-Abfrage in benutzerdefinierten Objekten

Map<String, MyObject> 

und MyObject:

class MyObject implements Serializeble { 
    // Map FieldName -> FieldValue 
    Map<String, Object> myMap; 
} 

So würde Ich mag Hazelcast distributed query Unterstützung verwenden, in meinem Objekt abzufragen. Ich habe überprüft, dass Hazelcast erhalten Methode verwendet den Objektwert, aber in meinem Fall abrufen Ich habe keine bekommen, statt Ich mag würde meine eigene getField wie implementieren:

Object getField(String fieldName) { 
    return myMap[fieldName]; 
} 

Und zwingen Hazelcast um diese Methode aufzurufen. Zur Umgehung des Problems habe ich Code gehackt Hazelcast eine CustomGetter in der Klasse 144

/hazelcast/src/main/java/com/hazelcast/query/impl/ReflectionHelper.java 

Leitung zu verwenden:

if (localGetter == null) { 
    localGetter = new CustomFieldGetter(name, obj); 
} 

und hier Meine CustomFieldGetter Klasse:

static class CustomFieldGetter extends Getter { 
    final Object value; 
    final Class type; 
    final String fieldName; 

    CustomFieldGetter(String fieldName, Object obj) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException { 
     super(null); 
     this.fieldName = fieldName; 
     this.value = obj.getClass().getMethod("getField", String.class).invoke(obj, fieldName); 
     this.type = value.getClass(); 
    } 

    @Override 
    Object getValue(Object obj) throws Exception { 
     return value; 
    } 

    @Override 
    Class getReturnType() { 
     return type; 
    } 

    @Override 
    boolean isCacheable() { 
     return false; 
    } 

    @Override 
    public String toString() { 
     return "FieldGetter [parent=" + parent + ", field=" + fieldName + "]"; 
    } 
} 

Ok cool, Nach der Neukompilierung von Hazelcast und der Verwendung dieses neuen Jar konnte ich Abfragen unter Verwendung von plain sql erreichen. Aber für pagingQueries habe ich einige Fehler bekommen.

Also meine letzte Frage ist: Ich möchte Hack-Hazelcast-Code vermeiden (für weitere Updates). Hat Hazelcast einige Unterstützung zu diesem Thema? Gibt es eine andere Lösung für dieses Problem?

PS: Ich bin mit Hazelcast-Version ->Hazelcast-3.3-RC3

Vielen Dank im Voraus.

+5

Anstatt dies in Stackoverflow zu posten, wäre es viel sinnvoller, eine Pullrequest mit dem Patch zu erstellen oder eine Feature-Anfrage im Bugtracker zu erstellen. Wir suchen nicht nach Anfragen im Netz, was nicht auf github steht, da ein Problem nicht als Anfrage existiert :) Eigentlich bin ich mir nicht sicher, ob es Sinn macht, so etwas hinzuzufügen, wenn man damit anfängt kommt jeder mit verschiedenen Methoden, wie Classloading. Getter/Setter werden durch die Bean-Spezifikation definiert. Wenn Sie sie nicht verwenden, besteht eine sehr hohe Wahrscheinlichkeit, dass kein Framework Ihren Weg unterstützt. PS: Warum PP macht Probleme, keine Ahnung :) – noctarius

+0

Danke für Ihren Vorschlag. Ich habe diesen Link auch in Hazelcast ML geteilt. Das Problem ist, wir können keine Getter und Setter erstellen, da diese Klassen in Echtzeit erstellt werden (das erneute Laden von jvm ist hier nicht möglich). Ich kann keine Pull-Anfrage erstellen, da sie zu sehr auf mein Problem zugeschnitten ist. Es ist nur eine palliative Lösung, bis wir den besten Ansatz gefunden haben. Jedenfalls schätze ich. – Santiago

Antwort

3

Eine Option ist die Implementierung der Schnittstelle Portable. Dann könnten Sie jeden Eintrag als separates Feld schreiben. Dies setzt voraus, dass der Eintragswert auch die Portable-Schnittstelle implementiert.

Betrachten Sie die sample code, wie man Portable benutzt.

+0

Es löst das Abfrageproblem nicht, oder? – noctarius

+1

Ich denke es tut. Es verwendet die Felder von Portable anstelle von Reflektionen, um einen Getter aufzurufen. –

+0

Ich glaube, es wird das Problem lösen. Implementieren Sie es jetzt. Lass es dich bald wissen. – Santiago

Verwandte Themen