JSF 2.x @ViewScoped托管bean线程是否安全?

Mar*_*ark 17 concurrency jsf cdi jsf-2 view-scope

我一直在谷歌搜索几个小时在这个问题上没有评估.

关于所提供示波器的线程安全性,WELD文档和CDI规范非常明确.

例如:

  • 适用范围 - 不安全

  • 会话范围 - 不安全

  • 请求范围 - 安全,始终绑定到单个线程

  • 会话范围 - 安全(由于WELD代理序列化来自多个请求线程的访问)

我在JSF 2.x定义的View Scope上找不到任何东西.

它与对话范围大致相同,因为尽管绑定到单个视图/用户,但多个请求很可能同时命中范围.我不知道的是JSF实现是否从多个请求序列化对bean的访问.

任何人都知道规格或Morraja/MyFaces的实施可以解决这个问题吗?

Bal*_*usC 17

视图范围与正常使用线程安全.它只能由一个浏览器窗口/选项卡使用.也就是说,它由在初始GET请求上设置的唯一隐藏输入字段键控.同一视图上的每个回发都将使用同一个视图范围的bean.浏览器本身已在同一窗口/选项卡中"同步"回发请求.新的浏览器窗口/选项卡实际上是一个新的GET请求,因此将创建一个新的完全独立的视图.

至于ajax回发,它们按规范排队.这在JSF 2规范的第13.3.2节中提到:

13.3.2 Ajax请求队列

所有Ajax请求必须在发送到服务器之前放入客户端请求队列,以确保按发送顺序处理Ajax请求.队列中等待时间最长的请求是下一个要发送的请求.发送请求后,Ajax请求回调函数必须从队列中删除请求(也称为出队).如果请求成功完成,则必须将其从队列中删除.如果出现错误,则必须通知客户端,但仍必须从队列中删除该请求,以便可以发送下一个请求.必须发送下一个请求(队列中最早的请求).jsf.ajax.request 有关Ajax请求队列的更多详细信息,请参阅JavaScript文档.

仅在使用PrimeFaces时,才能禁用排队<p:ajax async="true">.将此与视图范围bean结合使用时,必须以与会话范围bean相同的方式重新考虑threadsafety.

也可以看看:

  • 我理解,然而,就像对话范围一样,它可能在任何给定时间在飞行中存在多个ajax请求,每个请求导致一个请求线程可以访问范围的视图.想想有人垃圾邮件点击ajax按钮导致bean中的数据修改,如果这些请求的访问未被代理同步或序列化,则可能存在问题. (2认同)