在我们的一个生产系统中,我们遇到了一个非常奇怪的问题,在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。
有人遇到过这样的行为吗?有人有解释/解决方案或解决方法吗?
非常感谢
答案 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
谢谢大家