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.
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
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