【发布时间】:2011-07-21 07:22:17
【问题描述】:
我们的 portlet 将状态保存在 HttpSession 中,由同一会话的所有请求处理线程共享。
portlet 规范 (JSR-168) 写道:
PLT.5.2.4.3 请求处理期间的多线程问题
portlet 容器通过并发处理对同一个 portlet 的并发请求 在不同线程上执行请求处理方法。 Portlet 开发人员必须 设计他们的 portlet 以处理来自内部的多个线程的并发执行
processAction和render方法在任何特定时间。
我想知道我应该如何实现这一目标?当然,我可以在processAction 和render 期间使用同步来实现互斥,但是我看不到如何在整体上强制执行请求处理的原子性。特别是,我担心以下情况:
- 线程 1 执行
processAction,将数据加载到会话中以供稍后渲染 - 线程 2 执行
processAction,从会话中丢弃该数据 - 线程 1 执行
render,从会话中读取要呈现的数据,并抛出 NullPointerException,因为准备好的数据不再存在...
通常如何防止这种情况发生?特别是在使用 JBoss portlet 桥将 JSF 适配到 Portlet 环境时?
【问题讨论】:
标签: java multithreading jsf session-state portlet