如何解决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 举报,一经查实,本站将立刻删除。