针对使用带有 HTTP 会话的 ActivitySession 的用法模型
本主题描述在 WebSphere® Web 容器中运行的 Web 应用程序如何参与 ActivitySession 上下文。
如果设计 Web 应用程序,使多个 servlet 调用作为同一逻辑应用程序的一部分出现,那么 servlet 可使用 HttpSession 保存 servlet 调用间的状态。ActivitySession 上下文是一个状态,可暂挂到 HttpSession 中,并在以后调用访问 HttpSession 的 servlet 时再恢复。
ActivitySession 自动与 HttpSession 相关联,所以可用于扩展对多个 HTTP 调用以及 servlet 的包含或转接上的 ActivitySession 访问,并且支持 Web HTTP 客户机的生命周期可确定的 Enterprise JavaBeans (EJB) 激活周期。HttpSession 中存储的 ActivitySession 上下文还可用于使 ActivitySession 的工作反过来与特定 Web HTTP 客户机相关联。
- Web 容器启动和结束 ActivitySession。Web 应用程序调用已为 ActivitySession 的容器控制配置的 servlet。
- 如果 HttpSession 存在,那么它具有关联的 ActivitySession。
- 如果 HttpSession 不存在,那么 servlet 可启动 HttpSession,这导致 ActivitySession 自动启动,并与 HttpSession相关联。
在结束现有 HttpSession 后,servlet 才能启动新的 HttpSession。在 HttpSession 内,Web 应用程序可调用能使用关联的 ActivitySession 上下文的其他 servlet。当 Web 应用程序调用结束 HttpSession 的 servlet 时,ActivitySession 自动结束。这在下图中有所显示:
图 1. ActivitySession 的 Web 容器控制. 此图周围的文本对此图进行了描述。 - Web 应用程序启动和结束 ActivitySession。Web 应用程序调用已为 ActivitySession 的应用程序控制配置的 servlet。
- 如果 HttpSession 存在并具有关联的 ActivitySession,那么 servlet 使用或结束此 ActivitySession 上下文。
- 如果 HttpSession 不存在,servlet 可启动 HttpSession,但是这不会自动启动 ActivitySession。
- 如果 HttpSession 存在,但是没有关联的 ActivitySession,那么 servlet 可启动新的 ActivitySession。这将 ActivitySession 自动与 HttpSession 相关联。ActivitySession 持续到 ActivitySession 明确结束,或者 HttpSession 结束。
在结束现有 ActivitySession 后,servlet 才能启动新的 ActivitySession。结束现有 HttpSession 后,servlet 才能启动新的 HttpSession。
在 HttpSession 内,Web 应用程序可调用能使用或结束现有 ActivitySession 上下文的其他 servlet,或者如果不存在 ActivitySession,那么启动新的 ActivitySession。当 Web 应用程序调用结束 HttpSession 的 servlet 时,ActivitySession 自动结束。这在下图中有所显示:
图 2. ActivitySession 的 Web 应用程序控制. 此图周围的文本对此图进行了描述。
Web 应用程序可调用为用法模型配置的 servlet。
以下部分用于两个用法模型:
- 要结束 HttpSession(和任何关联的 ActivitySession),Web 应用程序必须使此会话失效。这导致为 ActivitySession 设立检查点。
- ActivitySession 上下文中激活的任何下游企业 Bean 可保存在内存中,而不是在 servlet 调用间已钝化,这是因为客户机有效地变成 Web HTTP 客户机。
- Web 应用程序可由很多 servlet 组成,而 Web 应用程序中的每个 servlet 可使用 ActivitySessionControl 的值进行配置。ActivitySessionControl 确定 servlet 或其容器是否启动任何 ActivitySession。
- 封装活动事务上下文的 ActivitySession 上下文不能与 HttpSession 相关联,这是因为事务可保持数据库锁定,而且应该设计为短期的。如果应用程序将活动事务移到 HttpSession,那么事务回滚,而 ActivitySession 暂挂到 HTTPSession 中。一般情况下,您应该将应用程序设计为使用 ActivitySession 或其他构造作为长期实体,而 ACID 事务作为这些应用程序中的短期实体。
- 对于 ActivitySession 的持续时间,任何时候只能有一个 ActivitySession 可与 HttpSession 相关联。与 HttpSession 关联的 ActivitySession 仍然在 ActivitySession 的持续时间内相关联,但是在完成第一个 ActivitySession 后,才能被另一个 ActivitySession 所替换。如果 servlet 已共享对 HttpSession 的访问,那么 ActivitySession 可被多个 servlet 访问。
- ActivitySession 不是持久的。如果持久 HttpSession 的存在时间长于主管它的服务器,那么在主管服务器结束时,终止已高速缓存的 ActivitySession。
- 如果在关联的 ActivitySession 结束前 HttpSession 超时,那么复位 ActivitySession1。这样将 ActivitySession 资源回滚到最后一个一致点:
- 如果 Web 应用程序调用已为 ActivitySession 的容器控制配置的 servlet,那么完全回滚 ActivitySession 资源。
- 如果 Web 应用程序调用已为 ActivitySession 的应用程序控制配置的 servlet,那么 ActivitySession 资源回滚到 servlet 执行的最后检查点,或者如果未设置检查点,那么完全回滚。
- 如果 ActivitySession 超时,那么将它复位到最后一个一致点(请参阅前一项),然后结束 HttpSession。