2016-08-12 4 views
1

이전 버전의 개체 (라이브러리, 업데이트되지 않은 개체, 등)가있는 클러스터 구성원이있는 경우 모델 개체의 관점에서 볼 때 IMAP 중복 항목이있을 수 있습니다. 라이브러리의 잘못된 관리 ...hazelcast MapStore가 IMAP 이전 버전의 객체를 삽입하는 것을 방지하려면 어떻게해야합니까?

당신이 피난처는 IMAP, 예를 들어, IMAP<MyKey, MyValue>를 들어, 있는 MyKey, MyValue의 다른 버전이 혼합 될 수 있다면

... 당신의 GET을

  1. 객체의 이전 버전 인 경우을 얻습니다.HazelcastSerializationException : java.io.InvalidClassException이
  2. 당신이 PUT을 수행 할 때 u는 예외를 얻을하지 않습니다 .... :(

이를 제어 할 수있는 방법?

감사합니다.

답변

3

이것은 실제로 개체를 serialize하는 방법에 따라 다릅니다.

  • 기본적 자바 직렬화 (MyKeyMyValueSerializable를 구현)에 의존하는 경우, static final long serialVersionUID를 사용하여 클래스의 각 수정시를 업데이트하는 당신의 필요보다.

  • 사용자 정의 직렬화 (예 : com.hazelcast.nio.serialization.StreamSerializer 구현)를 사용하는 경우 읽기 및 쓰기 모두에서 형식 변경을 감지하고 그에 따라 작동해야합니다.

참고 : 더 구체적인 대답을해야하는 경우, 수업 (MyKeyMyValue), 문제의지도 hazelcast의 conf 및 직렬화 기술의 일부 코드를 제공하십시오. (주석 후)

편집 :

나는 당신이 BINARY 당신의지도의 기본 in-memory-format을 사용한다고 가정하기 위하여려고하고있다. 이 경우, hazelcast는 비 순차 화없이 바이트 항목으로 맵 항목을 저장하므로 put()에 대한 예외는 없습니다. 그러나 get() 값일 때 hazelcast는이를 비 직렬화해야하며 예외가 발생하는 경우입니다.

in-memory-formatOBJECT으로 설정하면 hazelcast는 put()에 개체를 deserialize해야하며 예외가 발생합니다.

EDIT2 :

in-memory-format를 변경하지 않고 put()에 예외를 유발하는 또 다른 방법이있다. 지도에 EntryAddedListener을 추가 할 수 있습니다.

hz.getMap(Client.MAP_NAME).addEntryListener(new EntryAddedListener() {  
    public void entryAdded(EntryEvent event) { 
     // this will deserialize the new value and throw exception if format doesn't match 
     event.getValue(); 
    } 
}, true); 
+0

저는 Serializable 및 serialVersionUID를 사용하고 있습니다. 그러나 원격 노드에 differente 버전이 있다면 어떨까요?나는 tht를 경험 했으므로 아무런 예외도 발생시키지 않는다. 그러나 던져진다. IMAP 정의 된 에 오브젝트의 다른 버전을 넣으면 예외가 발생합니다 ..... – Azimuts

+0

@Azimuts @Azimuts 추가 정보에 대한 응답으로 내 대답을 편집했습니다. – noscreenname