SIP 应用会话 (SipApplicationSession)

 Application Session 为两个目的服务: 提供应用数据的存储和关联数种不同协议的 sessions. 注意: applicaton session 并不是 SIP 规范, 但是出于实际的原因, 这个版本的 SIP servlet API 定义了 javax.servlet.sip.SipApplicationSession 的应用会话对象.

 

协议会话 (protocol sessions)

 

下面的 SipApplicationSession  方法允许 servlets 获取包含的 protocol sessions:

  1. getSessions()
  2. getSessions(String protocol)
  3. getSipSession(String id);
  4. getSession(String id, Protocol protocol)

SipApplicationSession  生命周期

 

    容器管理会话数据, 所以需要一个机制知道 SipApplicationSession 对象什么时间不再使用了并交给 GC 回收. 这个机制就是 SipApplicationSession invalidation. 一个应用会话在下面的三种方法中的一种变为无效状态:

  1. SipApplicationSession 过期了并且容器随后把它设成了无效状态.
  2. 一个 servlet 直接调用了 invalidate() 方法.
  3. 一个 servlet 把 SipApplicationSession 标记为无效, 并且容器在 SipApplicationSession 进入 ready-to-invalidate 状态时把它设成了无效状态, 这个机制会在后面谈到.

出于性能的原因, 一般建议由应用程序尽快直接把 SipApplicationSession 和  SipSession 对象设置为无效.

 

SipApplicationSession  定时器操作和 SipApplicationSession 期满.

 

当一个 SipApplicationSession 创建了. 如果在部署描述文件中指定了会话超时(session-timeout) 参数, SipApplicationSession 定时器就会启动. 如果没有指定, 默认的超时时间的值被设置为 3分钟. 

如果会话超时时间为 0 或者更小, 那就会话定时器将永远不会启动, 容器不会考虑对象会在什么时候过期.

一个 SipApplicationSession 在两种方法中的一种过期.

1. Container rejects an application session lifetime extension by returning 0 to a setExpires() call.

2. 应用程序的 SipApplicationSessionListener 实现选择不调用 setExpires().

如果应用会话定时器被激活了并且过期超时时间已经到了, 那么所有的 SipApplicationSessionListener 实现的 sessionExpired 方法都会被调用.

 

SipApplicationSession Invalidation

 

有两种情况下的一种一个 SipApplicationSession 可以被设成无效状态.

1.明确的失效机制 (Explicit Invalidation Mechanism)

2. 当就绪时失效机制. (Invalidate When Ready Mechanism)

一旦一个 SipApplicationSession 被应用程序或者容器设置为无效, 它就不再被使用了. 容器或者应用程序必须尽快删除对这个对象的引用, 允许这个无效的 SipApplicationSession 对象可以被垃圾回收. 当有侦听器存在时并且在SipSession 和 SipApplicationSession 对象被销毁时, 容器必须执行侦听器回调方法: sessionDestroyed() .

 

明确的失效机制 Explicit Invalidation Mechanism

 

一个应用程序可以在任何时间调用 invalidate() 方法使一个 SipApplicationSession 失效. 在明确的失效情况下, 容器必须从内存中清理掉所有失效状态的 SipApplicationSession. 包括存储在 SipApplicationSession 中的所有应用状态数据以及包含的所有不同协议的子会话对象.

当 SipApplicationSession 已经失效了调用 invalidate() 方法会抛出 IllegalStateException 异常. 使用 invalidate 方法使一个 SipApplicationSession 失效会导致其中包含的所有各类协议会话也被容器明确设为失效.

 

Invalidate When Ready Mechanism

上面描述的明确的失效机制会导致容器立即将 SipSession 设为失效.
这个规范提供一个新的机制来失效会话使应用程序可以用来回避下面的不利条件, 这个机制叫 "Invalidate When Ready" 机制:
一个 SipApplicationSession 在下面的条件成立时被叫做进入 ready-to-invalidate 状态:
1. 所有包含的 SipSession 都进入 ready-to-invalidate 状态.
2. 没有相关的 ServletTimers 是激活的.

一个 SipApplicationSession 在下面的条件成立时过渡到 ready-to-invalidate 状态.
1. 最后的属于这个应用会话的协议会话是失效的.
2. 最后的和这个应用会话相关的 ServletTimer 过期了.

参考 6.2.4.2 的重要语义关于什么时候容器确定一个 SipSession 进入了 ready-to-invalidate 状态的细节.

 

绑定属性到 SipApplicationSession

 

一个 servlet 能够通过名称绑定对象属性到一个 SipApplicationSession.

一些对象可能需要在它们被替换或删除时收到通知. 这些信息可以通过实现 SipApplicationSessionBindingListener 接口获取到. 这个接口定义了两个方法会在一个对象被绑定到或者被解除绑定时被调用.

valueBound

valueUnbound

valueBound 方法必须在可以通过 SipApplicationSession 接口的 getAttribute 方法取得这个对象之前被调用. valueUnbound 方法必须在无法通过 SipApplicationSession 接口的 getAttribute 方法取得这个对象之后被调用.

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值