2014-08-29 15 views
6

Sto utilizzando Hazelcast come mappa condivisa nella mia applicazione. La mia mappa è così:Interrogazione di Hazelcast in oggetti personalizzati

Map<String, MyObject> 

e MyObject:

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

Così mi piacerebbe usare Hazelcast distributed query supporto per interrogare nel mio oggetto. Ho controllato che Hazelcast utilizza il metodo di ottenere per recuperare il valore dell'oggetto, ma nel mio caso non ho un GET, invece di mi piacerebbe implementare il mio getField come:

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

e la forza Hazelcast chiamare questo metodo Per aggirare il problema, Ho messo il codice Hazelcast di utilizzare una CustomGetter nella classe

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

linea 144:

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

e qui il mio CustomFieldGetter classe:

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 fresco, Dopo la ricompilazione di Hazelcast e l'utilizzo di questo nuovo jar, sono riuscito a raggiungere le query utilizzando sql semplice. Ma per pagingQueries ho avuto alcuni errori.

Quindi la mia ultima domanda è: Mi piacerebbe evitare di modificare il codice Hazelcast (per ulteriori aggiornamenti). Hazelcast ha alcuni supporti su questo problema? C'è qualche altra soluzione per questo problema?

PS: Sto utilizzando la versione Hazelcast ->Hazelcast-3.3-RC3

Grazie in anticipo.

+5

Invece di postarlo su StackOverflow sarebbe molto più significativo creare un pullrequest con la patch o creare una richiesta di funzionalità nel bugtracker. Non cerchiamo richieste in rete, cosa non è su github in quanto un problema non esiste come richiesta :) In realtà non sono sicuro se abbia senso aggiungere qualcosa del genere, se si avvia tutto questo viene con modi diversi, come il caricamento di classe. I getter/setter sono definiti dalle specifiche del bean, se non li usi c'è una possibilità molto alta che nessun framework supporti la tua strada. PS: Perché la PP fa problemi, nessuna idea :) – noctarius

+0

Grazie per il tuo suggerimento. Ho condiviso questo link anche in Hazelcast ML. Il problema è che non possiamo creare getter e setter, dato che queste classi vengono create su richiesta in tempo reale (jum non ricarica qui non è un'opzione). Non riesco a creare una richiesta di pull, poiché è troppo particolare per il mio problema, è solo una soluzione palliativa finché non si ottiene l'approccio migliore. Comunque apprezzo. – Santiago

risposta

3

Un'opzione è quella di implementare l'interfaccia Portable. Quindi è possibile scrivere ciascuna voce come un campo separato. Ciò presuppone che il valore di ingresso implementa anche l'interfaccia portatile.

Guarda sample code come utilizzare Portable.

+0

Non risolve il problema della query, vero? – noctarius

+1

Penso di sì. Utilizzerà i campi da Portable invece di usare reflection per richiamare un getter. –

+0

Credo che risolverà il problema. Implementandolo adesso. Ti faccio sapere presto – Santiago

Problemi correlati