spring-session中的事件机制原理是什么


这期内容当中小编将会给大家带来有关spring-session中的事件机制原理是什么,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。逐渐深入Spring-Session中的事件机制原理的探索。众所周知,Servlet规范中有对HttpSession的事件的处理,如:HttpSessionEvent/HttpSessionIdListener/HttpSessionListener,可以查看Package javax.servlet在Spring-Session中也有相应的Session事件机制实现,包括Session创建/过期/删除事件。本文主要从以下方面探索Spring-Session中事件机制Session事件的抽象事件的触发机制Note:
这里的事件触发机制只介绍基于RedissSession的实现。基于内存Map实现的MapSession不支持Session事件机制。其他的Session实现这里也不做关注。先来看下Session事件抽象UML类图,整体掌握事件之间的依赖关系。Session Event最顶层是ApplicationEvent,即Spring上下文事件对象。由此可以看出Spring-Session的事件机制是基于Spring上下文事件实现。抽象的AbstractSessionEvent事件对象提供了获取Session(这里的是指Spring Session的对象)和SessionId。基于事件的类型,分类为:Session创建事件Session删除事件Session过期事件Tips:
Session销毁事件只是删除和过期事件的统一,并无实际含义。事件对象只是对事件本身的抽象,描述事件的属性,如:获取事件产生的源:getSource获取事件产生源获取相应事件特性:getSession/getSessoinId获取时间关联的Session下面再深入探索以上的Session事件是如何触发,从事件源到事件监听器的链路分析事件流转过程。阅读本节前,读者应该了解Redis的Pub/Sub和KeySpace Notification,如果还不是很了解,传送门Redis Keyspace Notifications和Pub/Sub。上节中也介绍Session Event事件基于Spring的ApplicationEvent实现。先简单认识spring上下文事件机制:ApplicationEventPublisher实现用于发布Spring上下文事件ApplicationEventApplicationListener实现用于监听Spring上下文事件ApplicationEventApplicationEvent抽象上下文事件那么在Spring-Session中必然包含事件发布者ApplicationEventPublisher发布Session事件和ApplicationListener监听Session事件。可以看出ApplicationEventPublisher发布一个事件:Ifthespecified{@codeevent}isnotan{@linkApplicationEvent},
*itiswrappedina{@linkPayloadApplicationEvent}.
*@parameventtheeventtopublish
*@since4.2
*@seePayloadApplicationEvent
*/
voidpublishEvent(Objectevent);

}ApplicationListener用于监听相应的事件:Tips:
这里使用到了发布/订阅模式,事件监听器可以监听感兴趣的事件,发布者可以发布各种事件。不过这是内部的发布订阅,即观察者模式。Session事件的流程实现如下:上图展示了Spring-Session事件流程图,事件源来自于Redis键空间通知,在spring-data-redis项目中抽象MessageListener监听Redis事件源,然后将其传播至spring应用上下文发布者,由发布者发布事件。在spring上下文中的监听器Listener即可监听到Session事件。因为两者是Spring框架提供的对Spring的ApplicationEvent的支持。Session Event基于ApplicationEvent实现,必然也有其相应发布者和监听器的的实现。Spring-Session中的RedisSession的SessionRepository是RedisOperationSessionRepository。所有关于RedisSession的管理操作都是由其实现,所以Session的产生源是RedisOperationSessionRepository。在RedisOperationSessionRepository中持有ApplicationEventPublisher对象用于发布Session事件。但是该ApplicationEventPublisher是空实现,实际实现是在应用启动时由Spring-Session自动配置。在spring-session-data-redis模块中RedisHttpSessionConfiguration中有关于创建RedisOperationSessionRepository Bean时将调用set方法将ApplicationEventPublisher配置。在进行自动配置时,将上下文中的ApplicationEventPublisher的注入,实际上即ApplicationContext对象。Note:
考虑篇幅原因,以上的RedisHttpSessionConfiguration至展示片段。对于ApplicationListener是由应用开发者自行实现,注册成Bean即可。当有Session Event发布时,即可监听。以上部分探索了Session事件的发布者和监听者,但是核心事件的触发发布则是由Redis的键空间通知机制触发,当有Session创建/删除/过期时,Redis键空间会通知Spring-Session应用。RedisOperationsSessionRepository实现spring-data-redis中的MessageListener接口。该监听器即用来监听redis发布的消息。RedisOperationsSessionRepositorys实现了该Redis键空间消息通知监听器接口,实现如下:下续再深入每种事件产生的前世今生。1.Session创建事件的触发由RedisOperationSessionRepository向Redis指定通道${namespace}:event:created:${sessionId}发布一个messageMessageListener的实现RedisOperationSessionRepository监听到Redis指定通道${namespace}:event:created:${sessionId}的消息将其传播至ApplicationEventPublisherApplicationEventPublisher发布SessionCreateEventApplicationListener监听SessionCreateEvent,执行相应逻辑RedisOperationSessionRepository中保存一个Session时,判断Session是否新创建。
如果新创建,则向该save方法的调用是由HttpServletResponse提交时——即返回客户端响应调用,上篇文章已经详解,这里不再赘述。关于RedisOperationSessionRepository实现MessageListener上述已经介绍,这里同样不再赘述。Note:
这里有点绕。个人认为RedisOperationSessionRepository发布创建然后再本身监听,主要是考虑分布式或者集群环境中SessionCreateEvent事件的处理。2.Session删除事件的触发Tips:
删除事件中使用到了Redis KeySpace Notification,建议先了解该技术。由RedisOperationSessionRepository删除Redis键空间中的指定Session的过期键,Redis键空间会向**__keyevent@*:del**的channel发布删除事件消息MessageListener的实现RedisOperationSessionRepository监听到Redis指定通道**__keyevent@*:del**的消息将其传播至Application 香港云主机EventPublisherApplicationEventPublisher发布SessionDeleteEventApplicationListener监听SessionDeleteEvent,执行相应逻辑当调用HttpSession的invalidate方法让Session失效时,即会调用RedisOperationSessionRepository的deleteById方法删除Session的过期键。上篇中介绍了包装Spring Session为HttpSession,这里不再赘述。这里重点分析deleteById内容:后续流程同SessionCreateEvent流程。3.Session失效事件的触发Session的过期事件流程比较特殊,因为Redis的键空间通知的特殊性,Redis键空间通知不能保证过期键的通知的及时性。RedisOperationsSessionRepository中有个定时任务方法每整分运行访问整分Session过期键集合中的过期sessionId,如:spring:session:expirations:1439245080000。触发Redis键空间会向**__keyevent@*:expired**的channel发布过期事件消息MessageListener的实现RedisOperationSessionRepository监听到Redis指定通道**__keyevent@*:expired**的消息将其传播至ApplicationEventPublisherApplicationEventPublisher发布SessionDeleteEventApplicationListener监听SessionDeleteEvent,执行相应逻辑定时任务每整分运行,执行cleanExpiredSessions方法。expirationPolicy是RedisSessionExpirationPolicy实例,是RedisSession过期策略。将时间戳滚动至整分获取过期Session的集合调用Redis的Exists命令,访问过期Session键,触发Redis键空间消息至此Spring-Session的Session事件通知模块就已经很清晰:Redis键空间Session事件源:Session创建通道/Session删除通道/Session过期通道Spring-Session中的RedisOperationsSessionRepository消息监听器监听Redis的事件类型RedisOperationsSessionRepository负责将其传播至ApplicationEventPublisherApplicationEventPublisher将其包装成ApplicationEvent类型的Session Event发布ApplicationListener监听Session Event,处理相应逻辑上述就是小编为大家分享的spring-session中的事件机制原理是什么了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注开发云行业资讯频道。

相关推荐: MongoDB中怎么迁移部分数据

MongoDB中怎么迁移部分数据,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。场景:将mongodb部分数据从一台云服务器迁移到另一台云服务器命令:mongoexport、mong…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

(0)
打赏 微信扫一扫 微信扫一扫
上一篇 08/12 16:46
下一篇 08/12 16:46

相关推荐