尝试使用Hazelcast配置Spring Session。使用this文档可以直接使用它-可以使用默认的hazelcast节点。就我而言,我在同一个JVM上运行多个节点(这些节点位于不同的群集中),并且我需要使用特定的hazelcast实例来存储会话。我没有找到太多信息,如何配置它(通过hazelcast实例名称\或实例本身)。
将感谢您的帮助。
答案 0 :(得分:0)
会话存储在可用节点之间进行分片。您无法选择哪个节点托管任何特定的会话。此外,如果Hazelcast需要重新平衡分片,则会话可能会从一个节点移动到另一个节点。
instance-name
参数仅指示是要尝试找到与群集的现有连接,还是要开始新的连接。
也许问题是为什么您需要控制哪个节点托管哪个会话?
答案 1 :(得分:0)
接下来的代码让我将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;
}
}
答案 2 :(得分:0)
接下来的代码让我将Spring Session配置为使用特定节点,而不是默认节点。我唯一的问题是如何配置会话生存时间。
您是否尝试为session-node
实例设置映射配置的TTL秒?如果您确保将会话存储在cluster-2
中,那么为实例设置TTL可以解决您的问题:
@Bean
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
.setTimeToLiveSeconds(300)
.addMapAttributeConfig(attributeConfig)
.addMapIndexConfig(new MapIndexConfig(
HazelcastSessionRepository.PRINCIPAL_NAME_ATTRIBUTE, false));
return Hazelcast.newHazelcastInstance(config);
}