我们正在从 jboss 4 迁移到 jboss 6。Out 系统有大量的 EJB 2.1 bean。一旦我们在 jboss 6 中部署了应用程序,bean 就停止在方法调用之间保存状态。
这是正常的吗?如果没有,可以做些什么来克服这个问题?
编辑:2015.08.04
Bean:有状态
我希望我可以分享 src 代码,但是,该公司有非常严格的政策。
任何来自您的经验的指导或指示就足够了。
更多信息
场景:用户更新员工记录。
系统有一个 AbstractController 可以进行单条记录更新。控制器查找 bean 并检索它的句柄。然后,使用反射检索方法名称。然后将标志 'isDirty' 设置为 true(bean 内的 setter)
然后控制器通过调用 EJB 存储方法迭代更新每个字段的方法名称。在运行更新语句之前的 store 方法中,检查标志“isDirty”。
在 jboss 4 中,这个标志保持为“true”,但是当我们迁移到 6 时,这个标志开始恢复为 false。
仅供参考:这是遗留源,我真的希望我可以改变逻辑,但我不能。
更新:2015.08.04:3pm
我在 ejb 激活和钝化方法中放置了一个断点。豆子在激活后立即被钝化。继续我的调查。将保持此线程更新。
更新:2015.08.20 我根据 EJB 规范构建了一个示例应用程序,并在 jboss 5.1 和 6.3 中运行它
这两个实例是相同的。在方法调用之间,实体 bean 失去其状态
bean.doSomething();
bean.doSomethingElse();
Run Code Online (Sandbox Code Playgroud)
结果
setEntityContext(EntityContext ctx) invoked --- Flag Value-false
ejbCreate() invoked --- Flag Value-false
ejbPostCreate() invoked --- Flag Value-false
ejbPassivate() invoked --- Flag Value-false
unsetEntityContext() invoked --- Flag Value-false
setEntityContext(EntityContext ctx) invoked --- Flag Value-false
ejbActivate() invoked --- Flag Value-false
ejbLoad() invoked --- Flag Value-false
[EmailConfigBean] doSomething invoked.--- Flag Value Updated to-true
ejbStore() invoked --- Flag Value-true
ejbPassivate() invoked --- Flag Value-true
unsetEntityContext() invoked --- Flag Value-true
setEntityContext(EntityContext ctx) invoked --- Flag Value-false
ejbActivate() invoked --- Flag Value-false
ejbLoad() invoked --- Flag Value-false
[EmailConfigBean] doSomethingElse invoked.--- int Value Updated to-10
ejbStore() invoked --- Flag Value-false
ejbPassivate() invoked --- Flag Value-false
unsetEntityContext() invoked --- Flag Value-false
Run Code Online (Sandbox Code Playgroud)
做了一些进一步的挖掘,我读了这个
“Bean Provider 可以使用实例变量来存储依赖于实体 bean 实例持久状态的值,尽管不鼓励这种使用。Bean Provider 应该使用 ejbLoad 方法来重新同步依赖于实体 bean 实例的任何实例变量的值实体 bean 的持久状态。一般来说,任何依赖于实体 bean 持久状态的非持久状态都应该在 ejbLoad 方法期间重新计算。
换句话说,您有责任在 ejbLoad 期间将“isDirty”设置为正确的状态。您不应该期望它从一次调用到下一次调用保留任何特定的值——如果确实如此,那只是因为特定的实现或偶然。
过了很长一段时间,我弄清楚了这种行为的原因。
基本上,在 jboss 6.3 中,他们只支持提交选项 3。
什么是提交选项?这是我们在事务提交时对实体 bean 状态的控制。
什么是提交选项 3?“池化bean:在事务结束时,实例及其状态都无效(实例将被钝化并返回到池中)。每个客户端调用都会引发一个ejbActivate、ejbLoad,然后是业务方法,然后是ejbStore和ejbPassivate ”
基于 6.3 的迁移指南
“在 JBoss EAP 5.x 中,还可以自定义缓存、池、提交选项和拦截器堆栈。在 JBoss EAP 6 中,这不再可能。只有一种实现,类似于 Instance带有提交选项 C 的每个事务策略”
感谢大家的支持 - 希望我的问题可以帮助其他陷入类似问题的菜鸟。和平