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