尝试使用Hazelcast配置Spring Session。它可以使用this doc开箱即用 - 但它使用默认的hazelcast节点。在我的情况下,我在同一个JVM上运行几个节点(它们位于不同的集群中),我需要使用特定的hazelcast实例来存储我的会话。我没有找到太多信息,如何配置它(传递hazelcast实例名称\或实例本身)。
将不胜感激任何帮助。
会话存储在可用节点之间进行分片。您无法选择哪个节点承载任何特定会话。此外,如果Hazelcast需要重新平衡分片,则会话可能会从一个节点移动到另一个节点。
instance-name
参数只是决定是否尝试查找与群集的现有连接或是否开始新的连接。
也许问题是为什么你需要控制哪个节点主持哪个会话?
下一代码让我配置Spring Session以使用特定节点,而不是默认节点。我唯一的问题是如何配置会话时间。 hazelcastSessionRepository.setDefaultMaxInactiveInterval(3600)
只设置最长的非活动时间,而不是生存时间。
@Configuration
@EnableSpringHttpSession
public class HazelcastSessionConfig {
@Bean//default
public HazelcastInstance hazelcastInstance() {
Config config = new Config();
config.setInstanceName("cache-node");
config.getGroupConfig().setName("cluster-1");
return Hazelcast.newHazelcastInstance(config);
}
@Bean//Node I need to use
public HazelcastInstance hazelcastSessionInstance() {
Config config = new Config();
config.setInstanceName("session-node");
config.getGroupConfig().setName("cluster-2");
MapAttributeConfig attributeConfig = new MapAttributeConfig()
.setName(HazelcastSessionRepository.PRINCIPAL_NAME_ATTRIBUTE)
.setExtractor(PrincipalNameExtractor.class.getName());
final MapConfig mapConfig = config.getMapConfig(HazelcastSessionRepository.DEFAULT_SESSION_MAP_NAME);
mapConfig
.addMapAttributeConfig(attributeConfig)
.addMapIndexConfig(new MapIndexConfig(
HazelcastSessionRepository.PRINCIPAL_NAME_ATTRIBUTE, false));
return Hazelcast.newHazelcastInstance(config);
}
@Bean//Pass node here
public HazelcastSessionRepository sessionRepository(HazelcastInstance hazelcastSessionInstance) {
final HazelcastSessionRepository hazelcastSessionRepository = new HazelcastSessionRepository(hazelcastSessionInstance);
hazelcastSessionRepository.setDefaultMaxInactiveInterval(3600);
return hazelcastSessionRepository;
}
}