2016-08-09 7 views
1

私のアプリは、春のブート+ヘイルキャストに基づいています。Hazelcast、HazelcastSerializationException、データをマップに配置するとき

私はhazelcastに簡単なエンティティを保存しようとしています:私はトレースとcom.hazelcast.nio.serialization.HazelcastSerializationExceptionを受けたエンティティを保存しようとしていた場合

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

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 
} 

マイサービスメソッドは次のようになり

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お返事ありがとうございます。いいえ。常にヘビキャストのためのカスタムシリアライザを追加する必要がありますか? –

+0

@ I.Domshchikon noですが、スタックトレースは、不正なシリアライゼーションconfによって引き起こされる可能性があることを示唆しています。 'addMap(mapConfigMap、method2、annotation)'のコードを追加できますか? – noscreenname

答えて

0

これが答えその推測の詳細ですが、私はhazelcastのgithubの上で同様のissueを見つけました。

ハトキャストのconfがアノテーションから作成されている場合、サードパーティのseriliazersが検出されている可能性があります(ハイバネーションキャッシュとしてハローキャストを使用していますか?)。この場合、すべてのハローキャストインスタンス(クライアントとサーバー)にシリアル化クラスを含むjarを含める必要があります。

関連する問題