2016-08-09 4 views
1

내 앱은 봄 부팅 + hazelcast를 기반으로합니다. 내가 hazelcast로 간단한 개체를 저장하려고Hazelcast, HazelcastSerializationException 데이터를 매핑 할 때

:

public class ExampleMeeting implements Serializable { 

    private static final long serialVersionUID = 1L; 

    private String id; 
    private String name; 

    public ExampleMeeting(String id, String name) { 
    this.id = id; 
    this.name = name; 
    } 

    public ExampleMeeting() { 
    } 

// getters and setters 
} 

내 서비스 방법은 다음과 같이 :

@CachePut(value = MEETING_CACHE_NAME, key = "#meeting.id") 
    public ExampleMeeting saveMeeting(ExampleMeeting meeting) { 
    LOGGER.info("Save meeting to cache {}", meeting); 
    return meeting; 
    } 

내가 추적과 com.hazelcast.nio.serialization.HazelcastSerializationException을받은 엔티티에 저장하는 것을 시도하고있다 :

com.hazelcast.nio.serialization.HazelcastSerializationException: There is no suitable de-serializer for type 2. This exception is likely to be caused by differences in the serialization configuration between members or between clients and members. 
    at com.hazelcast.internal.serialization.impl.AbstractSerializationService.newHazelcastSerializationException(AbstractSerializationService.java:173) 
    at com.hazelcast.internal.serialization.impl.AbstractSerializationService.readObject(AbstractSerializationService.java:200) 
    at com.hazelcast.internal.serialization.impl.ByteArrayObjectDataInput.readObject(ByteArrayObjectDataInput.java:600) 
    at com.hazelcast.cluster.impl.ConfigCheck.readData(ConfigCheck.java:215) 
    at com.hazelcast.cluster.impl.JoinMessage.readData(JoinMessage.java:98) 
    at com.hazelcast.cluster.impl.JoinRequest.readData(JoinRequest.java:68) 
    at com.hazelcast.internal.serialization.impl.DataSerializer.read(DataSerializer.java:121) 
    at com.hazelcast.internal.serialization.impl.DataSerializer.read(DataSerializer.java:47) 
    at com.hazelcast.internal.serialization.impl.StreamSerializerAdapter.read(StreamSerializerAdapter.java:46) 
    at com.hazelcast.internal.serialization.impl.AbstractSerializationService.readObject(AbstractSerializationService.java:204) 
    at com.hazelcast.internal.serialization.impl.ByteArrayObjectDataInput.readObject(ByteArrayObjectDataInput.java:600) 
    at com.hazelcast.cluster.impl.MulticastService.receive(MulticastService.java:201) 
    at com.hazelcast.cluster.impl.MulticastService.run(MulticastService.java:159) 
    at java.lang.Thread.run(Thread.java:745) 

여기 내 헤즐리티 캐스트 설정입니다 :

@Bean 
    HazelcastInstance hazelcastInstance() { 

    Config config = new ClasspathXmlConfig(hazelcatsConfig); 

    Map<String, MapConfig> mapConfigMap = new HashMap<String, MapConfig>(); 

    ClassPathBeanDefinitionScanner scanner = new ClassPathBeanDefinitionScanner(applicationContext); 
    for (BeanDefinition bd : scanner.findCandidateComponents("com.egalacoral.spark")) { 
     String className = bd.getBeanClassName(); 
     try { 
     Class<?> classObj = Class.forName(className); 
     Method[] methods = classObj.getDeclaredMethods(); 
     for (Method method2 : methods) { 
      Cacheable annotation = AnnotationUtils.getAnnotation(method2, Cacheable.class); 
      if (annotation != null && annotation.value().length > 0) { 
      addMap(mapConfigMap, method2, annotation); 
      } 
     } 
     } catch (ClassNotFoundException e) { 
     LOGGER.error("Error while creating maps for caches", e); 
     } 
    } 
    config.setMapConfigs(mapConfigMap); 
    return Hazelcast.newHazelcastInstance(config); 
    } 

이 문제를 어떻게 해결할 수 있는지 알려주십시오.

UPADATED는 :

protected void addMap(Map<String, MapConfig> mapConfigMap, Method method2, Cacheable annotation) { 
    MapConfig mapConfig = new MapConfig(); 
    HazelcastMapConfig cacheConfig = AnnotationUtils.getAnnotation(method2, HazelcastMapConfig.class); 
    mapConfig.setEvictionPolicy(cacheConfig.evictionPolicy()); 
    String timeToLiveSeconds = cacheConfig.timeToLiveSeconds(); 
    if (StringUtils.hasText(timeToLiveSeconds)) { 
     timeToLiveSeconds = this.embeddedValueResolver.resolvePlaceholders(timeToLiveSeconds); 
    } 
    mapConfig.setTimeToLiveSeconds(Integer.parseInt(timeToLiveSeconds)); 
    String key = annotation.value()[0]; 
    mapConfigMap.put(key, mapConfig); 
    LOGGER.info("Created map for cache {} : {} ", key, mapConfig); 
    } 
+0

감사합니다? '.addSerializerConfig (new SerializerConfig(). setImplementation (serializer) .setTypeClass (ExampleMeeting.class)))')와 같은 것? – noscreenname

+0

@noscreenname 응답 해 주셔서 감사합니다. 아니. 항상 hazelcast에 대한 사용자 지정 serializer를 추가해야합니까? –

+0

@I.Domshchikon 아니요, stacktrace가 잘못된 직렬화 conf로 인해 발생할 수 있다고 제안했습니다. 'addMap (mapConfigMap, method2, annotation)'의 코드를 추가 할 수 있습니까? – noscreenname

답변

0

이 답변이 추측 더 많은,하지만 난 hazelcast의 GitHub의에 비슷한 issue을 발견했다.

annelion에서 hazelcast conf가 생성 될 때, tird-party seriliazers가 감지 될 수 있습니다 (최대 절전 모드 캐시로 헤이즐 캐스팅을 사용하고 있습니까?). 이 경우, 모든 hazelcast 인스턴스 (클라이언트 및 서버)에 직렬화 클래스를 포함하는 jar를 포함해야합니다.