当前位置: 首页 > 知识库问答 >
问题:

Wildfly 8.2 JSF会话范围:有时返回错误数据

轩辕源
2023-03-14

在我们生产中的一个系统中,我们在jboss 8.2和最新的JDK 7、centos 7 64位、javax.enterprise.context.SessionScoped bean上的最新primeface中遇到了一个非常奇怪的问题。(整个项目中不使用jsf注释,仅使用CDI注释以避免潜在冲突)

在处理一个请求的过程中,@SessionScoped bean在某个时间点(我们不知道是什么触发了它)给出了相互矛盾的信息。然而,处理总是只发生在一个会话和一个线程中。

以下是请求处理正常时的日志行(简化示例)(这里是两个连续的请求):

15:00:00 : thread 1 - req 1 - OurWeirdSessionScopedBean.process.step1 : login : "UserA";
15:00:00 : thread 1 - req 1 - OurWeirdSessionScopedBean.process.step2 : login : "UserA";
15:00:00 : thread 1 - req 1 - OurWeirdSessionScopedBean.process.step3 : login : "UserA";
15:00:00 : thread 1 - req 1 - OurWeirdSessionScopedBean.process.step4 : login : "UserA";
15:00:00 : thread 1 - req 1 - OurWeirdSessionScopedBean.process.step5 : login : "UserA";
15:00:01 : thread 1 - req 1 - OurWeirdSessionScopedBean.process.step6 : login : "UserA";
15:00:01 : thread 1 - req 1 - OurWeirdSessionScopedBean.process.step7 : login : "UserA";

15:00:04 : thread 2 - req 2 - OurWeirdSessionScopedBean.process.step1 : login : "UserB";
15:00:04 : thread 2 - req 2 - OurWeirdSessionScopedBean.process.step2 : login : "UserB";
15:00:04 : thread 2 - req 2 - OurWeirdSessionScopedBean.process.step3 : login : "UserB";
15:00:04 : thread 2 - req 2 - OurWeirdSessionScopedBean.process.step4 : login : "UserB";
15:00:04 : thread 2 - req 2 - OurWeirdSessionScopedBean.process.step5 : login : "UserB";
15:00:04 : thread 2 - req 2 - OurWeirdSessionScopedBean.process.step6 : login : "UserB";
15:00:04 : thread 2 - req 2 - OurWeirdSessionScopedBean.process.step7 : login : "UserB";

以下是请求处理“损坏”(两个连续请求)时的日志行。注意登录值:

16:00:00 : thread 1 - req 1 - OurWeirdSessionScopedBean.process.step1 : login : "UserA";
16:00:00 : thread 1 - req 1 - OurWeirdSessionScopedBean.process.step2 : login : "UserB";
16:00:00 : thread 1 - req 1 - OurWeirdSessionScopedBean.process.step3 : login : "UserB";
16:00:00 : thread 1 - req 1 - OurWeirdSessionScopedBean.process.step4 : login : "UserA";
16:00:00 : thread 1 - req 1 - OurWeirdSessionScopedBean.process.step5 : login : "UserB";
16:00:01 : thread 1 - req 1 - OurWeirdSessionScopedBean.process.step6 : login : "UserB";
16:00:01 : thread 1 - req 1 - OurWeirdSessionScopedBean.process.step7 : login : "UserA";

16:00:04 : thread 2 - req 2 - OurWeirdSessionScopedBean.process.step1 : login : "UserB";
16:00:04 : thread 2 - req 2 - OurWeirdSessionScopedBean.process.step2 : login : "UserX";
16:00:04 : thread 2 - req 2 - OurWeirdSessionScopedBean.process.step3 : login : "UserX";
16:00:04 : thread 2 - req 2 - OurWeirdSessionScopedBean.process.step4 : login : "UserB";
16:00:04 : thread 2 - req 2 - OurWeirdSessionScopedBean.process.step5 : login : "UserX";
16:00:04 : thread 2 - req 2 - OurWeirdSessionScopedBean.process.step6 : login : "UserX";
16:00:04 : thread 2 - req 2 - OurWeirdSessionScopedBean.process.step7 : login : "UserB";

很长一段时间(通常5-10小时)一切正常,然后发生了一些事情(时间/线程耗尽/厄运/…?不知道),然后webapp“坏了”。当它被破坏时,如上所示的数据不匹配是频繁的,但不是系统性的。

唯一的解决办法是重新启动wildfly。

在损坏状态下,只有一个用户的超文本传输协议会话挂起(没有超文本传输协议会话断开/连接),仅连续点击网页中的按钮,可以观察到这种错误行为。关键是,我很肯定,当服务器被“破坏”时,这个错误只能在一个用户和没有负载的情况下重现。

提示:OurWeirdSessionScopedBean是支持xhtml页面的managedBean,它被注入(CDI@Inject)到处理过程中涉及的其他CDIBean中。

似乎在其他CDIBean中注入的我们的WeirdSessionScopedBean的代理并不总是引用与xhtml页面的backingBean相同的数据。但它应该是同一个对象。OurWeirdSessionScopedBean被注释为@SessionScoped和@Named。

有人遇到过这样的行为吗?有人有解释/解决方案或变通方法吗?

非常感谢

共有1个答案

姜玉泽
2023-03-14

似乎我们确实遇到了一个位于韦尔德的野蝇8.2错误。有关更多信息,请参阅此jira:https://issues.jboss.org/browse/WFLY-4753

修复方法是用这个补丁修补野蝇:http://sourceforge.net/projects/jboss/files/Weld/2.2.12.Final

谢谢大家

 类似资料:
  • TL;DR我们得到bean实例,这些实例注入了另一个会话的内容 最近,我们的两个客户系统出现了严重问题。我们的客户正在两台机器上运行同一个JSF2.2应用程序的两个独立实例,这两台机器有一个Glassfish 4.0服务器和WELD 2.0。5(向内存泄漏致敬!)。 一些用户报告问题,例如提交表单后,响应显示的用户名与最初登录的用户名不同。由于我们无法在开发和测试环境中重现这种行为,我们开始从生产

  • 我有一个电子表格,由外部应用程序通过Google Sheets API编辑。然后,我在电子表格中有一个谷歌应用程序脚本函数,它由可安装的更改触发器调用。在开始时,此函数检查changeType是否等于“EDIT”,然后使用getActiveRange()检查编辑范围的最后一列。这很好,但有时返回的范围比实际编辑的范围小。功能代码: 例如,我们有一个空范围A3: G5。在这个范围内插入值后,它会正确

  • HttpSession 对象必须被限定在应用(或 servlet 上下文)级别。底层的机制,如使用 cookie 建立会话,不同的上下文可以是相同,但所引用的对象,包括该对象中的属性,决不能在容器上下文之间共享。 用一个例子来说明该要求: 如果 servlet 使用 RequestDispatcher 来调用另一个 Web 应用的 servlet,任何创建的会话和被调用 servlet 所见的必须

  • 我正试图将一个Tomcat应用程序移植到JettyRunner9.2。我想将我的应用程序移到Heroku,所以我需要用嵌入式服务器或JettyRunner启动它。我认为JettyRunner将是最容易的,因为我可以保持一个战争格式,并使它容易港口离开,如果需要。 任何帮助都将不胜感激。如果我不能让它很快工作,我可以尝试嵌入式Tomcat,或者考虑不需要更改容器的托管。 如果使用Jetty的不同方法

  • 问题内容: 尝试此计算时出现溢出错误,但我不知道原因。 问题答案: 您要求math.exp计算的数字以十进制表示,超过110,000个数字。这稍微超出了double的范围,因此会导致溢出。

  • 问题内容: 假设我有一个像 然后在主要我有代码 显然,无论json格式不同,上述代码都会产生nil错误。Go中的json.Unmarshal()什么时候返回错误? 问题答案: 如果源中的值与目标中的值不对应,则JSON解码器不会报告错误。例如,如果源包含“状态”字段,这不是错误,但目标没有。 在其他情况下,Unmarshal函数确实会返回错误: 语法错误 类型不匹配 游乐场的例子