2014-08-29 23 views
6

Tôi đang sử dụng Hazelcast làm bản đồ dùng chung trong ứng dụng của mình. Bản đồ của tôi là như thế:Truy vấn Hazelcast trong các đối tượng tùy chỉnh

Map<String, MyObject> 

MyObject:

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

Vì vậy, tôi muốn sử dụng Hazelcast distributed query hỗ trợ để truy vấn trong đối tượng của tôi. Tôi đã kiểm tra rằng Hazelcast sử dụng được của phương pháp để lấy giá trị đối tượng, nhưng trong trường hợp của tôi, tôi không có một get, thay vì tôi muốn thực hiện của riêng tôi getField như:

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

Và buộc Hazelcast để gọi phương thức này. Là một workaround, tôi đã bị hack đang Hazelcast sử dụng một CustomGetter trong lớp

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

dòng 144:

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

và đây CustomFieldGetter lớp của tôi:

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 mát mẻ, sau khi biên dịch lại Hazelcast, và sử dụng lọ mới này, tôi có thể tiếp cận các truy vấn bằng cách sử dụng sql đơn giản. Nhưng đối với pagingQueries tôi có một số lỗi.

Vì vậy, câu hỏi cuối cùng của tôi là: Tôi muốn tránh hack mã Hazelcast (để cập nhật thêm). Hazelcast có một số hỗ trợ về vấn đề này không? Có giải pháp nào khác cho vấn đề này không?

PS: Tôi đang sử dụng phiên bản Hazelcast ->Hazelcast-3,3-RC3

Cảm ơn trước.

+5

Thay vì đăng bài này lên Stackoverflow, việc tạo pullrequest với bản vá hoặc tạo yêu cầu tính năng trong trình gỡ lỗi sẽ là cách có ý nghĩa hơn. Chúng tôi không tìm kiếm các yêu cầu trên mạng, những gì không phải trên github như một vấn đề không tồn tại như một yêu cầu :) Thực ra tôi không chắc liệu nó có ý nghĩa để thêm một cái gì đó như thế, nếu bạn bắt đầu với các cách khác nhau, giống như tải lớp. Getters/setters được định nghĩa bởi thông số bean, nếu bạn không sử dụng chúng, sẽ có rất nhiều cơ hội không có framework hỗ trợ theo cách của bạn. PS: Tại sao PP làm cho vấn đề, không có ý tưởng :) – noctarius

+0

Cảm ơn đề xuất của bạn. Tôi cũng đã chia sẻ liên kết này trong Hazelcast ML. Vấn đề là, chúng ta không thể tạo ra các getters và setters, vì các lớp này được tạo theo yêu cầu trong thời gian thực (tải lại jvm không phải là một tùy chọn ở đây). Tôi không thể tạo ra một yêu cầu kéo, vì nó quá đặc biệt đối với vấn đề của tôi, nó chỉ là một giải pháp giảm nhẹ cho đến khi chúng tôi có được cách tiếp cận tốt nhất. Dù sao tôi đánh giá cao. – Santiago

Trả lời

3

một tùy chọn là triển khai giao diện Portable. Sau đó, bạn có thể viết từng mục như một trường riêng biệt. Điều này giả định giá trị nhập thực hiện giao diện di động là tốt.

Nhìn vào sample code cách sử dụng Thiết bị di động.

+0

Nó không giải quyết được vấn đề truy vấn, phải không? – noctarius

+1

Tôi nghĩ là vậy. Nó sẽ sử dụng các trường từ Portable thay vì sử dụng sự phản chiếu để gọi một getter. –

+0

Tôi tin rằng nó sẽ giải quyết được vấn đề. Thực hiện nó ngay bây giờ. Hãy cho bạn biết sớm. – Santiago

Các vấn đề liên quan