微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Hazelcast 优雅的方式来处理 com.hazelcast.nio.serialization.HazelcastSerializationException java.io.InvalidClassException

如何解决Hazelcast 优雅的方式来处理 com.hazelcast.nio.serialization.HazelcastSerializationException java.io.InvalidClassException

在我们的 Spring Boot 应用程序中,我们使用 Hazelcast 作为分布式缓存。有时会忘记更改缓存对象上的 serialVersionUID,这导致有很多异常和我们的警报因下面的错误而发疯。

java.io.InvalidClassException: com.company.service.server.domain.someObject; local class incompatible: stream classdesc serialVersionUID = -5387655287348283785,local class serialVersionUID = -1803841624490656210
    at java.io.ObjectStreamClass.initNonProxy(ObjectStreamClass.java:699)
    at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:2002)
    at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1849)
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2159)
    at java.io.ObjectInputStream.readobject0(ObjectInputStream.java:1666)
    at java.io.ObjectInputStream.readobject(ObjectInputStream.java:502)
    at java.io.ObjectInputStream.readobject(ObjectInputStream.java:460)
    at com.hazelcast.internal.serialization.impl.JavaDefaultSerializers$JavaSerializer.read(JavaDefaultSerializers.java:84)
    at com.hazelcast.internal.serialization.impl.JavaDefaultSerializers$JavaSerializer.read(JavaDefaultSerializers.java:77)
    at com.hazelcast.internal.serialization.impl.StreamSerializerAdapter.read(StreamSerializerAdapter.java:48)
    at com.hazelcast.internal.serialization.impl.AbstractSerializationService.toObject(AbstractSerializationService.java:187)
    at com.hazelcast.map.impl.proxy.MapProxySupport.toObject(MapProxySupport.java:1237)
    at com.hazelcast.map.impl.proxy.MapProxyImpl.get(MapProxyImpl.java:120)
    at com.hazelcast.spring.cache.HazelcastCache.lookup(HazelcastCache.java:162)
    at com.hazelcast.spring.cache.HazelcastCache.get(HazelcastCache.java:67)

我试图找到一种方法来更好地集中处理这个问题。所以每次类似的事情发生时,我们都会通过代码从缓存中驱逐不兼容的对象。

我发现 spring boot 提供了一个用于覆盖错误处理的接口,即: org.springframework.cache.interceptor.CacheErrorHandler 。

package org.springframework.cache.interceptor;

import org.springframework.cache.Cache;
import org.springframework.lang.Nullable;

public interface CacheErrorHandler {
    void handleCacheGetError(RuntimeException var1,Cache var2,Object var3);

    void handleCachePutError(RuntimeException var1,Object var3,@Nullable Object var4);

    void handleCacheevictError(RuntimeException var1,Object var3);

    void handleCacheClearError(RuntimeException var1,Cache var2);
}

但是这个接口只用于处理运行时异常,而不是像 InvalidClassException 那样检查异常。

有没有人对如何以中央和干净的方式处理它有任何其他想法?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。