客户端/服务端模式下Hazelcast MapStore的store()方法在map.put时未触发
可能的故障原因及排查点
- 首先排查服务端MapStore实例化失败问题:你在服务端配置MapStore时用
mapStoreConfig.setClassName(CorrelationMapStore.class.getCanonicalName())注册实现类,Hazelcast默认会自行反射实例化这个类,不会走Spring容器管理。你实现类里依赖的CorrelationDAO是通过自定义的SpringApplicationContext静态方法获取,需要确认:- 服务端的Spring上下文初始化完成后才启动Hazelcast实例,否则
SpringApplicationContext持有的上下文为空,拿不到DAO实例 - 检查服务端日志有没有打印
Error while getting Correlation DAO bean from context的错误日志,若存在则是DAO获取失败,store方法直接跳过了写入逻辑
- 服务端的Spring上下文初始化完成后才启动Hazelcast实例,否则
- 确认服务端classpath包含完整的依赖类:客户端-服务端模式下MapStore完全运行在服务端,需要保证
CorrelationMapStore、Correlation实体、CorrelationDAO以及相关依赖的工具类、异常类都在服务端的运行时classpath中,缺少类会导致MapStore初始化失败,不会触发任何持久化逻辑 - 检查Correlation实体类是否实现序列化接口:客户端调用
map.put时需要将Correlation对象序列化后传输到服务端,如果没有实现Serializable接口,put操作会抛出序列化异常,数据根本不会写入服务端IMap,自然不会触发store方法,建议先查看客户端调用put时有没有抛出异常 - 核对服务端Map配置是否生效:服务端启动时可以增加日志打印
config.getMapConfig("correlationMap").getMapStoreConfig().isEnabled()的返回值,确认MapStore配置确实被加载;如果服务端存在同名的Map配置覆盖了你定义的配置,也会导致MapStore未开启 - 确认客户端与服务端Hazelcast版本一致:跨大版本的Hazelcast客户端和服务端通信会出现很多兼容问题,可能出现客户端返回put成功,但服务端实际未处理写入请求的情况
- 排查分组配置不匹配问题:虽然你配置了客户端和服务端的group名密码一致,但如果实际运行时加载的配置值不匹配,客户端可能默认启动了本地嵌入式Hazelcast实例而非连接远程服务端,此时你操作的是本地没有配置MapStore的IMap,自然不会触发持久化,可以在客户端调用
map.put后登录Hazelcast管理中心或者通过服务端日志确认数据是否真的写入了远程服务端的correlationMap
内容的提问来源于stack exchange,提问作者sandeep
相关产品推荐
相关产品推荐

