我们的portlet在HttpSession中保持状态,HttpSession由同一会话的所有请求处理线程共享。
portlet规范(JSR-168)写道:
PLT.5.2.4.3请求处理期间的多线程问题
portlet容器通过并发处理对同一portlet的并发请求 在不同的线程上执行请求处理方法。 Portlet开发人员必须 设计他们的portlet来处理来自内部的多个线程的并发执行
processAction方法。
我想知道我应该如何实现这一目标?当然,我可以使用同步来实现render
和processAction
期间的互斥,但我不知道如何强制执行整个请求处理的原子性。特别是,我担心以下情况:
render
,将数据加载到会话中以便以后呈现processAction
,从会话中丢弃该数据processAction
,读取要从会话呈现的数据,并抛出NullPointerException,因为准备好的数据不再存在...... 这种情况通常会如何阻止?特别是,当使用JBoss portlet桥来调整JSF到Portlet环境时?
答案 0 :(得分:1)
我想说如果有两个portlet在相同的数据上运行,特别是一个读取它而另一个删除它,那么设计中很可能存在严重的缺陷。
然后,您可能希望按portlet /线程存储数据,即如果portlet1读取某些数据,则应将其锁定,直到读取完成并使用唯一键将其放入会话中。
如果删除应呈现的数据是合法的,那么您应考虑到这一点并在render
期间再次检查。