Portlet、HttpSession 和线程安全

mer*_*ike 5 java jsf multithreading portlet session-state

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

portlet 规范 (JSR-168) 写道:

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

portlet 容器通过在不同线程上并发执行请求处理方法来处理对同一 portlet 的并发请求。Portlet 开发人员必须将他们的 Portlet 设计为在任何特定时间处理来自processActionrender方法内的多个线程的并发执行 。

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

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

通常如何防止这种情况?特别是,当使用 JBoss portlet 桥使 JSF 适应 Portlet 环境时?

Tho*_*mas 1

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

然后,您可能想要存储每个 portlet/线程的数据,即,如果 portlet1 读取一些数据,您应该写入锁定它,直到读取完成,然后使用唯一密钥将其放入会话中。

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