HazelcastSerializationException выдается при помещении списка объектов в кэш Hazelcast - PullRequest
0 голосов
/ 17 января 2019

Учитывая, что у меня есть сущность:

@Entity
public class NotificationType implements Serializable {
    // enum
    private DeliveryPriority deliveryPriority;

    private long sortOrder;

    // TimeStringInterval class implements Serializable
    private TimeStringInterval deliveryTimeWindow;

    // enum
    private DeliveryGroup deliveryGroup = DeliveryGroup.IMMEDIATE;

    protected String code;

    @Id
    public String getCode() {
        return code;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof CodedEntity)) return false;
        CodedEntity<?> that = (CodedEntity<?>) o;
        return Objects.equals(getCode(), that.getCode());
    }

    @Override
    public int hashCode() {
        return Objects.hashCode(getCode());
    }
}

и репозиторий Spring Data для поиска экземпляров NotificationType

@Repository
@CacheConfig(cacheNames = NOTIFICATION_TYPE_CACHE_NAME)
public interface NotificationTypeRepository extends JpaRepository<NotificationType, String> {

    @Override
    @Cacheable
    List<NotificationType> findAll();
}

и findAll метод кешируется.

Моя конфигурация Hazelcast:

@Bean(destroyMethod = "shutdown")
public HazelcastInstance hazelcastInstance() {
    HazelcastInstance hazelcastInstance = new HazelcastInstanceFactory(hazelCastConfig()).getHazelcastInstance();
    return hazelcastInstance;
}

@Bean
public Config hazelCastConfig() {
    Config config = new Config("hazelcast")

    config.getNetworkConfig().getJoin().getMulticastConfig().setEnabled(false);
    config.getNetworkConfig().getJoin().getAwsConfig().setEnabled(false);
    config.getNetworkConfig().getJoin().getTcpIpConfig().setEnabled(true).setMembers("localhost");

    config.getSerializationConfig().setEnableCompression(true);

    LockConfig lockConfig = new LockConfig();
    lockConfig.setName("locks");
    config.addLockConfig(lockConfig);

    ListConfig listConfig = new ListConfig();
    listConfig.setName("lists");
    config.addListConfig(listConfig);

    return config;
}

Когда я выполняю findAll() и hazelcast пытается поместить список в кэш, он выдает HazelcastSerializationException:

2019-01-17 16:12:20.762 ERROR --- [hz.ntf-cache.partition-operation.thread-7][][] SetOperation                             : [localhost]:5701 [ntf-cluster-1547735979367] [3.11.1] There is no suitable de-serializer for type 1921036036. This exception is likely to be caused by differences in the serialization configuration between members or between clients and members.

com.hazelcast.nio.serialization.HazelcastSerializationException: There is no suitable de-serializer for type 1921036036. 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:238) ~[hazelcast-3.11.1.jar:3.11.1]
    at com.hazelcast.internal.serialization.impl.AbstractSerializationService.readObject(AbstractSerializationService.java:265) ~[hazelcast-3.11.1.jar:3.11.1]
    at com.hazelcast.internal.serialization.impl.ByteArrayObjectDataInput.readObject(ByteArrayObjectDataInput.java:574) ~[hazelcast-3.11.1.jar:3.11.1]
    at com.hazelcast.internal.serialization.impl.ArrayListStreamSerializer.read(ArrayListStreamSerializer.java:49) ~[hazelcast-3.11.1.jar:3.11.1]
    at com.hazelcast.internal.serialization.impl.ArrayListStreamSerializer.read(ArrayListStreamSerializer.java:31) ~[hazelcast-3.11.1.jar:3.11.1]
    at com.hazelcast.internal.serialization.impl.StreamSerializerAdapter.read(StreamSerializerAdapter.java:48) ~[hazelcast-3.11.1.jar:3.11.1]
    at com.hazelcast.internal.serialization.impl.AbstractSerializationService.toObject(AbstractSerializationService.java:187) ~[hazelcast-3.11.1.jar:3.11.1]
    at com.hazelcast.map.impl.record.ObjectRecordFactory.newRecord(ObjectRecordFactory.java:37) ~[hazelcast-3.11.1.jar:3.11.1]
    at com.hazelcast.map.impl.recordstore.AbstractRecordStore.createRecord(AbstractRecordStore.java:111) ~[hazelcast-3.11.1.jar:3.11.1]
    at com.hazelcast.map.impl.recordstore.AbstractEvictableRecordStore.createRecord(AbstractEvictableRecordStore.java:55) ~[hazelcast-3.11.1.jar:3.11.1]
    at com.hazelcast.map.impl.recordstore.DefaultRecordStore.putInternal(DefaultRecordStore.java:701) ~[hazelcast-3.11.1.jar:3.11.1]
    at com.hazelcast.map.impl.recordstore.DefaultRecordStore.set(DefaultRecordStore.java:680) ~[hazelcast-3.11.1.jar:3.11.1]
    at com.hazelcast.map.impl.operation.SetOperation.run(SetOperation.java:39) ~[hazelcast-3.11.1.jar:3.11.1]
    at com.hazelcast.spi.Operation.call(Operation.java:170) [hazelcast-3.11.1.jar:3.11.1]
    at com.hazelcast.spi.impl.operationservice.impl.OperationRunnerImpl.call(OperationRunnerImpl.java:208) [hazelcast-3.11.1.jar:3.11.1]
    at com.hazelcast.spi.impl.operationservice.impl.OperationRunnerImpl.run(OperationRunnerImpl.java:197) [hazelcast-3.11.1.jar:3.11.1]
    at com.hazelcast.spi.impl.operationexecutor.impl.OperationThread.process(OperationThread.java:147) [hazelcast-3.11.1.jar:3.11.1]
    at com.hazelcast.spi.impl.operationexecutor.impl.OperationThread.process(OperationThread.java:125) [hazelcast-3.11.1.jar:3.11.1]
    at com.hazelcast.spi.impl.operationexecutor.impl.OperationThread.run(OperationThread.java:110) [hazelcast-3.11.1.jar:3.11.1]

В чем причина этого исключения?

Как мне решить эту проблему?

Сообщение об исключении очень загадочное.

Я пытался отлаживать список объектов, которые работают, и сравнивать его с этим списком, но я не смог обнаружить никакой существенной разницы.

Эта проблема возникает локально на компьютере Windows, последняя версия Hazelcast

1 Ответ

0 голосов
/ 17 января 2019

Я добавил

private static final long serialVersionUID = 1L;

и все стало работать нормально.

Рекомендуется также в официальной документации Hazelcast :

Чтобы устранить проблемы совместимости классов, рекомендуется добавить serialVersionUID

...