Wildfly 8.2 + JSF + SessionScoped:有时会返回错误的数据

时间:2015-06-05 19:56:50

标签: jsf session cdi wildfly jboss-weld

在我们的一个生产系统中,我们遇到了一个非常奇怪的问题,在jboss 8.2和最新的JDK 7,centos 7 64位, javax.enterprise.context.SessionScoped bean上的最新主要问题。 (整个项目中没有使用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。

在“已损坏”状态下,只有一个用户具有待处理的http会话(没有http会话断开/连接),只能连续点击网页上的按钮,就可以观察到这种错误行为。关键是我很肯定当服务器被“破坏”时,只需一个用户就可以重现该错误。

提示:OurWeirdSessionScopedBean是支持我们的xhtml页面的managedBean,并在处理中涉及的其他CDI bean中注入(CDI @Inject)。

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

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

非常感谢

1 个答案:

答案 0 :(得分:2)

我们确实遇到了位于Weld的Wildfly 8.2漏洞。有关更多信息,请参阅此jira:https://issues.jboss.org/browse/WFLY-4753

修复方法是使用此修补程序修补Wildfly:http://sourceforge.net/projects/jboss/files/Weld/2.2.12.Final

谢谢大家