Hazelcast Spring Session传递节点实例

时间:2019-03-20 14:55:48

标签: hazelcast spring-session

尝试使用Hazelcast配置Spring Session。使用this文档可以直接使用它-可以使用默认的hazelcast节点。就我而言,我在同一个JVM上运行多个节点(这些节点位于不同的群集中),并且我需要使用特定的hazelcast实例来存储会话。我没有找到太多信息,如何配置它(通过hazelcast实例名称\或实例本身)。

将感谢您的帮助。

3 个答案:

答案 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);
}