Portlets,HttpSession和Thread-Safety

时间:2011-03-23 13:00:03

标签: java multithreading jsf session-state portlet

我们的portlet在HttpSession中保持状态,HttpSession由同一会话的所有请求处理线程共享。

portlet规范(JSR-168)写道:

  

PLT.5.2.4.3请求处理期间的多线程问题

     

portlet容器通过并发处理对同一portlet的并发请求   在不同的线程上执行请求处理方法。 Portlet开发人员必须   设计他们的portlet来处理来自内部的多个线程的并发执行   processAction方法。

我想知道我应该如何实现这一目标?当然,我可以使用同步来实现renderprocessAction期间的互斥,但我不知道如何强制执行整个请求处理的原子性。特别是,我担心以下情况:

  • 线程1执行render,将数据加载到会话中以便以后呈现
  • 线程2执行processAction,从会话中丢弃该数据
  • 线程1执行processAction,读取要从会话呈现的数据,并抛出NullPointerException,因为准备好的数据不再存在......

这种情况通常会如何阻止?特别是,当使用JBoss portlet桥来调整JSF到Portlet环境时?

1 个答案:

答案 0 :(得分:1)

我想说如果有两个portlet在相同的数据上运行,特别是一个读取它而另一个删除它,那么设计中很可能存在严重的缺陷。

然后,您可能希望按portlet /线程存储数据,即如果portlet1读取某些数据,则应将其锁定,直到读取完成并使用唯一键将其放入会话中。

如果删除应呈现的数据是合法的,那么您应考虑到这一点并在render期间再次检查。