Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring 是否从Hazelcast会话存储库获取会话事件?_Spring_Session_Events_Hazelcast - Fatal编程技术网

Spring 是否从Hazelcast会话存储库获取会话事件?

Spring 是否从Hazelcast会话存储库获取会话事件?,spring,session,events,hazelcast,Spring,Session,Events,Hazelcast,在Spring boot应用程序中使用嵌入式Hazelcast会话存储库时,不会导致会话关闭或过期事件。我确实收到会话创建事件。我有一个非常短的会话超时(30秒)。我已经通过从服务器获得“未经授权”的回复来验证会话是否在30秒后过期。您如何接收会话过期/销毁事件 这是我的会话配置: @Configuration @EnableHazelcastHttpSession(maxInactiveIntervalInSeconds = 30) public class SessionConfigurat

在Spring boot应用程序中使用嵌入式Hazelcast会话存储库时,不会导致会话关闭或过期事件。我确实收到会话创建事件。我有一个非常短的会话超时(30秒)。我已经通过从服务器获得“未经授权”的回复来验证会话是否在30秒后过期。您如何接收会话过期/销毁事件

这是我的会话配置:

@Configuration
@EnableHazelcastHttpSession(maxInactiveIntervalInSeconds = 30)
public class SessionConfiguration{

    @Bean
    @SpringSessionHazelcastInstance
    public HazelcastInstance hazelcastInstance() {
        Config config = new Config();
        config.setClusterName("spring-session-cluster");

        // Add this attribute to be able to query sessions by their PRINCIPAL_NAME_ATTRIBUTE's
        AttributeConfig attributeConfig = new AttributeConfig()
                .setName(Hazelcast4IndexedSessionRepository.PRINCIPAL_NAME_ATTRIBUTE)
                .setExtractorClassName(Hazelcast4PrincipalNameExtractor.class.getName());

        // Configure the sessions map
        config.getMapConfig(Hazelcast4IndexedSessionRepository.DEFAULT_SESSION_MAP_NAME)
                .addAttributeConfig(attributeConfig).addIndexConfig(
                new IndexConfig(IndexType.HASH, Hazelcast4IndexedSessionRepository.PRINCIPAL_NAME_ATTRIBUTE));

        // Use use custom serializer to de/serialize sessions faster. This is optional.
        SerializerConfig serializerConfig = new SerializerConfig();
        serializerConfig.setImplementation(new HazelcastSessionSerializer()).setTypeClass(MapSession.class);
        config.getSerializationConfig().addSerializerConfig(serializerConfig);

        return Hazelcast.newHazelcastInstance(config);
    }
    
    @Bean
    public SessionRepositoryCustomizer<Hazelcast4IndexedSessionRepository> customize() {
        return (sessionRepository) -> {
            sessionRepository.setFlushMode(FlushMode.IMMEDIATE);
            sessionRepository.setSaveMode(SaveMode.ALWAYS);
            sessionRepository.setSessionMapName(Hazelcast4IndexedSessionRepository.DEFAULT_SESSION_MAP_NAME);
            sessionRepository.setDefaultMaxInactiveInterval(30); //this is extra; tried with and without
        };
    }
}
config.getMapConfig(Hazelcast4IndexedSessionRepository.DEFAULT_SESSION_MAP_NAME)
            .addAttributeConfig(attributeConfig).addIndexConfig(
            new IndexConfig(IndexType.HASH, Hazelcast4IndexedSessionRepository.PRINCIPAL_NAME_ATTRIBUTE))
            .setMaxIdleSeconds(tout);
部分答案(我不知道为什么它会起作用):

如果将会话映射侦听器添加到HazelcastInstance(在创建bean中),您会突然开始接收SessionExpiredEvents

因此,更换线路:

config.getMapConfig(Hazelcast4IndexedSessionRepository.DEFAULT_SESSION_MAP_NAME)
            .addAttributeConfig(attributeConfig).addIndexConfig(
            new IndexConfig(IndexType.HASH, Hazelcast4IndexedSessionRepository.PRINCIPAL_NAME_ATTRIBUTE));
使用(将最大空闲秒数设置为会话映射配置):

使用(将会话条目侦听器添加到会话映射)

HazelcastInstance=Hazelcast.newHazelcastInstance(配置);
IMap map=instance.getMap(Hazelcast4IndexedSessionRepository.DEFAULT_SESSION_map_NAME);
addEntryListener(新的HazelcastSessionEntryListener(),true);
返回实例;
其中HazelcastSessionEntryListener的定义如下:

@Component
public class HazelcastSessionEntryListener implements EntryListener<Object, Object>
{
    public HazelcastSessionEntryListener(){}

    @Override
    public void entryAdded(EntryEvent<Object, Object> event){}

    @Override
    public void entryUpdated(EntryEvent<Object, Object> event){}

    @Override
    public void entryRemoved(EntryEvent<Object, Object> event){}

    @Override
    public void entryEvicted(EntryEvent<Object, Object> event){}

    @Override
    public void entryExpired(EntryEvent<Object, Object> event){}

    @Override
    public void mapCleared(MapEvent event){}

    @Override
    public void mapEvicted(MapEvent event){}
}
@组件
公共类HazelcastSessionEntryListener实现EntryListener
{
公共HazelcastSessionEntryListener(){}
@凌驾
public void entryAdded(EntryEvent事件){}
@凌驾
public void entryUpdated(EntryEvent事件){}
@凌驾
public void entryRemoved(EntryEvent事件){}
@凌驾
public void entryexecuted(EntryEvent事件){}
@凌驾
public void entryExpired(EntryEvent事件){}
@凌驾
公共无效mapCleared(MapEvent事件){}
@凌驾
public void mapReceived(MapEvent事件){}
}
有趣的是,在我的例子中,HazelcastSessionEntryListener只是一个空的实现(它什么都不做)。看起来像是童车行为(但我不是弹簧专家)

return Hazelcast.newHazelcastInstance(config);
HazelcastInstance instance = Hazelcast.newHazelcastInstance(config);
IMap<Object, Object> map = instance.getMap( Hazelcast4IndexedSessionRepository.DEFAULT_SESSION_MAP_NAME );
map.addEntryListener( new HazelcastSessionEntryListener(), true );
return instance;
@Component
public class HazelcastSessionEntryListener implements EntryListener<Object, Object>
{
    public HazelcastSessionEntryListener(){}

    @Override
    public void entryAdded(EntryEvent<Object, Object> event){}

    @Override
    public void entryUpdated(EntryEvent<Object, Object> event){}

    @Override
    public void entryRemoved(EntryEvent<Object, Object> event){}

    @Override
    public void entryEvicted(EntryEvent<Object, Object> event){}

    @Override
    public void entryExpired(EntryEvent<Object, Object> event){}

    @Override
    public void mapCleared(MapEvent event){}

    @Override
    public void mapEvicted(MapEvent event){}
}