2014-08-29 96 views
6

我在我的應用程序中使用Hazelcast作爲共享地圖。我的地圖是這樣的:自定義對象中的Hazelcast查詢

Map<String, MyObject> 

MyObject

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

所以我想使用Hazelcast distributed query支持我的對象查詢。我檢查了Hazelcast使用獲得的方法來檢索對象的值,但對我來說,我沒有一個get,而不是我想實現我自己的getField像:

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

,並迫使Hazelcast調用這個方法。作爲一種變通方法,我砍死Hazelcast代碼中的類

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

線使用CustomGetter 144:

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

,在這裏我CustomFieldGetter類:

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 + "]"; 
    } 
} 

好涼,在重新編譯Hazelcast之後,使用這個新的jar,我可以使用普通的sql來查詢。但對於pagingQueries,我有一些錯誤。

所以我最後的問題是: 我想避免黑客Hazelcast代碼(進一步更新)。 Hazelcast在這個問題上有一些支持嗎?有沒有其他解決方案來解決這個問題?

PS:我使用Hazelcast版本 - >hazelcast-3.3-RC3提前

感謝。

+5

而不是發佈到Stackoverflow這將是更有意義的創建一個pullrequest的補丁或在bugtracker中創建一個功能請求。我們不在網上搜索請求,什麼不在github作爲一個問題不存在作爲一個請求:) 其實我不知道是否有意義添加類似的東西,如果你開始這個每個人來以不同的方式,類加載。 getters/setters是由bean規範定義的,如果你沒有使用它們,那麼很可能沒有框架支持你的方式。 PS:爲什麼PP會造成問題,不知道:) – noctarius 2014-09-02 04:23:21

+0

感謝您的建議。我也在Hazelcast ML中分享了這個鏈接。問題是,我們無法創建getter和setter,因爲這些類是根據需要實時創建的(重新加載jvm不是此處的選項)。我無法創建拉請求,因爲它對我的問題太過分了,在我們得到最佳方法之前,這只是一個姑息性解決方案。 無論如何,我很感激。 – Santiago 2014-09-02 13:24:18

回答

3

一個選項是實現Portable接口。然後你可以把每個條目寫成一個單獨的字段。這假設輸入值也實現了Portable接口。

看看sample code如何使用Portable。

+0

它不能解決查詢問題,是嗎? – noctarius 2014-09-03 04:18:36

+1

我認爲它的確如此。它將使用Portable的字段而不是使用反射來調用getter。 – 2014-09-03 14:28:42

+0

我相信它會解決問題。現在就實施它。讓你儘快知道。 – Santiago 2014-09-03 15:58:21