Spring Session配置Hazelcast客户端后仍用内存存储问题排查
问题诊断与解决方案
一、检查依赖配置
确保你的pom.xml(Maven)或build.gradle(Gradle)中引入了正确的依赖,尤其是Spring Session Hazelcast和Hazelcast客户端,避免嵌入式Hazelcast的自动引入干扰:
Maven 示例:
<!-- Spring Session 核心依赖 --> <dependency> <groupId>org.springframework.session</groupId> <artifactId>spring-session-core</artifactId> </dependency> <!-- Spring Session 集成 Hazelcast --> <dependency> <groupId>org.springframework.session</groupId> <artifactId>spring-session-hazelcast</artifactId> </dependency> <!-- Hazelcast 客户端(不要引入hazelcast核心包,避免自动创建嵌入式集群) --> <dependency> <groupId>com.hazelcast</groupId> <artifactId>hazelcast-client</artifactId> </dependency>
Gradle 示例:
implementation 'org.springframework.session:spring-session-core' implementation 'org.springframework.session:spring-session-hazelcast' implementation 'com.hazelcast:hazelcast-client'
如果同时引入了hazelcast(嵌入式集群包),Spring Boot会自动创建嵌入式实例,优先于你的客户端Bean,导致会话存储到嵌入式集群而非独立集群。
二、禁用嵌入式Hazelcast自动配置
如果无法避免引入hazelcast包,需要在启动类上禁用嵌入式Hazelcast的自动配置:
@SpringBootApplication(exclude = HazelcastAutoConfiguration.class) public class YourApplication { public static void main(String[] args) { SpringApplication.run(YourApplication.class, args); } }
三、确保Hazelcast客户端Bean的唯一性与正确性
- 检查Bean唯一性:如果Spring容器中有多个
HazelcastInstance类型的Bean,即使你加了@SpringSessionHazelcastInstance注解,Spring Session可能无法正确识别。确保只有你配置的客户端Bean是唯一的HazelcastInstance。 - 验证集群连接状态:在Bean初始化后添加日志,确认客户端是否成功连接到独立集群:
@Bean @SpringSessionHazelcastInstance public HazelcastInstance hazelcastInstance() { ClientConfig clientConfig = new ClientConfig(); clientConfig.getNetworkConfig().addAddress("127.0.0.1:5701"); clientConfig.setClusterName(HAZELCAST_CLUSTER_NAME); clientConfig.getUserCodeDeploymentConfig().setEnabled(true) .addClass(Session.class) .addClass(MapSession.class) .addClass(Hazelcast4SessionUpdateEntryProcessor.class); HazelcastInstance client = HazelcastClient.newHazelcastClient(clientConfig); // 打印日志确认连接状态 System.out.println("Hazelcast Client connected to cluster members: " + client.getCluster().getMembers()); return client; }
四、明确指定Spring Session配置
在application.properties中补充以下配置,强制Spring Session使用Hazelcast并指定会话存储的Map名称:
spring.session.store-type=hazelcast spring.session.hazelcast.map-name=spring:session:sessions
同时,确保独立Hazelcast集群中存在该Map的配置(可在集群的hazelcast.xml中添加):
<map name="spring:session:sessions"> <!-- 根据需求配置会话过期时间等参数 --> <time-to-live-seconds>1800</time-to-live-seconds> </map>
五、排查用户代码部署问题
你配置的getUserCodeDeploymentConfig中添加了多个类,需确保这些类在客户端和集群端的类路径一致,否则会导致序列化/反序列化失败,会话无法正确存储。如果集群端已包含这些类(比如Spring Session依赖),可考虑禁用用户代码部署避免冲突:
clientConfig.getUserCodeDeploymentConfig().setEnabled(false);
内容的提问来源于stack exchange,提问作者Tobi
相关产品推荐
相关产品推荐

