gpt4 book ai didi

java - Portlet、HttpSession 和线程安全

转载 作者:搜寻专家 更新时间:2023-11-01 03:44:30 24 4
gpt4 key购买 nike

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

Portlet 规范 (JSR-168) 写道:

PLT.5.2.4.3 Multithreading Issues During Request Handling

The portlet container handles concurrent requests to the same portlet by concurrent execution of the request handling methods on different threads. Portlet developers must design their portlets to handle concurrent execution from multiple threads from within the processAction and render methods at any particular time.

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

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

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

最佳答案

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

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

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

关于java - Portlet、HttpSession 和线程安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5405594/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com