【发布时间】:2013-05-06 17:18:44
【问题描述】:
我们有一个 webapp 实现为多个 OSGi 包的场景。我们希望进行捆绑更新,以透明地将错误修复等部署到正在运行的系统。假设更新周期包含刷新和包重新启动,当正在重新加载其类的对象已存储在导致 ClassCastExceptions 的 HttpSession 上时,这将导致问题。
我们正在研究几种不同的方法来使包更新成为可能,而不会丢失登录会话中的状态。为了简化会话状态访问依赖图,我们正在考虑设置以下限制:
- 一个bundle只能访问它自己的会话状态,即不能直接访问另一个bundle设置的状态(强制调用bundle API来间接访问它的状态)
- 添加到会话状态的对象的 Java 类应该来自包本身(以避免我们的会话状态受到其他包的更新而不是我们自己的影响) 这些限制实际上只有以下一些替代方案才需要。
因此,这些是我们以某种从最小到最大暗示顺序提出的替代方案:
- 将所有状态存储为
java.*类型(String、List等)
–> 状态类永远不会重新加载。 - 将会话锁定到创建其状态的服务版本(由 f ex 使用 proxying solutions 转发到该会话之前使用的版本)
-> 新会话将选择更新的捆绑包版本,而现有会话将保留旧版本。 - 更新捆绑包时序列化会话状态并将其反序列化回新的捆绑包版本(类似于应用服务器会话序列化,但在更精细的级别上)
-> 所有会话都将获取更新的捆绑包,但要求序列化状态兼容。 - 只要有活动会话,就避免更新有状态服务,利用传统的负载平衡器技术一次更新一个应用服务器
-> 部署周期更长,可能需要更多资源。 - 完全避免有状态的
OSGi服务并在其他地方保留状态
-> 没有处理OSGi中的问题...
我是否错过了任何有趣的选择?
您推荐什么解决方案?
[虽然这篇文章明确讨论了会话状态,但同样的讨论可能适用于其他范围,例如会话状态、应用程序状态等]
【问题讨论】:
-
如何将存储在会话中的实际对象保存在自己的包中?那不会避免类转换异常吗?
-
是的,我正在考虑将其添加为单独的替代方案,但我没有,因为如果更新了具有“状态类”的捆绑包,我们仍然会回到其他替代方案。
标签: java session osgi httpsession