Hazelcast IExecutorService序列化异常问题求助
解决Hazelcast IExecutorService序列化内部类失败问题
方案1:将内部类改为静态内部类
非静态内部类会隐式持有外部类的实例引用,序列化内部类时会触发外部类的序列化操作。将内部类改为静态后,不再持有外部类引用,仅需自身实现Serializable即可完成序列化。
修改后的代码示例:
public class CacheEventHandleServiceImpl { private HazelcastInstance myHazelcastInstance = Hazelcast.newHazelcastInstance(); private IExecutorService myExecutorService = myHazelcastInstance.getExecutorService("exec"); private DataTransferModel res; private static final Logger log = LoggerFactory.getLogger(CacheEventHandleServiceImpl.class); @Override public void newEntryCacheHandle(DataTransferModel dataTransferModel, boolean flag) { res = dataTransferModel; log.info("HANDLING ENTRY CACHE"); myExecutorService.execute(new MyOtherRunnable()); } // 改为静态内部类 private static class MyOtherRunnable implements Runnable, Serializable { @Override public void run() { Logger log = LoggerFactory.getLogger(CacheEventHandleServiceImpl.class); log.info("MY OTHER RUNNABLE!!!!!!!!!"); } } }
注意:静态内部类无法直接访问外部类的非静态成员,若需要使用外部类资源,可通过构造参数传递或使用静态成员。
方案2:让外部类实现Serializable接口
如果必须保留非静态内部类结构,可让外部类实现Serializable接口,并使用transient修饰不需要序列化的成员(如Hazelcast实例这类无法/无需序列化的对象)。
修改后的代码示例:
// 外部类实现Serializable接口 public class CacheEventHandleServiceImpl implements Serializable { // 用transient修饰无需序列化的成员 private transient HazelcastInstance myHazelcastInstance = Hazelcast.newHazelcastInstance(); private transient IExecutorService myExecutorService = myHazelcastInstance.getExecutorService("exec"); private DataTransferModel res; private static final Logger log = LoggerFactory.getLogger(CacheEventHandleServiceImpl.class); @Override public void newEntryCacheHandle(DataTransferModel dataTransferModel, boolean flag) { res = dataTransferModel; log.info("HANDLING ENTRY CACHE"); myExecutorService.execute(new MyOtherRunnable()); } class MyOtherRunnable implements Runnable, Serializable { @Override public void run() { log.info("MY OTHER RUNNABLE!!!!!!!!!"); } } }
错误根源解析
Java非静态内部类会隐式持有外部类的实例引用,当Hazelcast通过IExecutorService分发MyOtherRunnable时,需要序列化该对象,进而触发外部类CacheEventHandleServiceImpl的序列化。由于外部类未实现Serializable接口,最终抛出NotSerializableException。
内容的提问来源于stack exchange,提问作者Đinh Tuấn Anh
相关产品推荐
相关产品推荐

