EJB 2.1 不在 jboss 6.3 中跨方法调用保留状态
EJB 2.1 doesn't preserve state across method calls in jboss 6.3
我们正在从 jboss 4 迁移到 jboss 6。
Out 系统有大量的 EJB 2.1 bean。一旦我们在 jboss 6 中部署了应用程序,bean 就停止跨方法调用保留状态。
这正常吗?如果没有,可以做些什么来克服这个问题?
编辑:2015.08.04
Bean:有状态
我希望我可以分享 src 代码,但是公司有非常严格的政策。
根据您的经验提供任何指导或方向就足够了。
更多信息
场景:用户更新员工记录。
系统有一个 AbstractController,它执行单个记录更新。控制器查找 bean 并检索它的句柄。
然后,它使用反射检索方法名称。
然后设置一个标志 'isDirty' 为 true (setter inside the bean)
控制器然后通过调用 EJB 存储方法迭代更新每个字段的方法名称。在更新语句 运行 之前的存储方法中,检查标志 'isDirty'。
在 jboss 4 中,此标志保持为 'true',但当我们迁移到 6 时,此标志开始恢复为 false。
仅供参考:这是遗留资源,我真的希望我能改变逻辑,但我不能。
更新: 2015.08.04: 3pm
我在 ejb 激活和钝化方法中放置了一个断点。 bean 在被激活后立即被钝化。继续我的调查。将保持此线程更新。
更新:2015.08.20
我根据 EJB 规范和 运行 在 jboss 5.1 和 6.3
中构建了一个示例应用程序
这两个实例是相同的。在方法调用之间,实体 bean 失去其状态
bean.doSomething();
bean.doSomethingElse();
结果
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
做了一些进一步的挖掘,我读到了这个
"Bean Provider 可以使用实例变量来存储依赖于持久状态的值
实体 bean 实例,尽管不鼓励这种使用。 Bean Provider 应该使用 ejbLoad
方法来重新同步依赖于实体 bean 的持久性的任何实例变量的值
状态。通常,任何依赖于实体 bean 的持久状态的非持久状态都应该是
在 ejbLoad 方法期间重新计算。"
换句话说,您负责在 ejbLoad 期间将 "isDirty" 设置为正确的状态。
您不应该期望它在一次调用和下一次调用之间保留任何特定值——如果确实如此,那只是因为
特定实现或意外。
经过很长一段时间后,我弄清楚了这种行为的原因。
基本上,在 jboss 6.3 中,他们只支持提交选项 3。
什么是提交选项?
它是我们在事务提交时对实体 bean 状态的控制。
什么是提交选项 3?
"Pooled bean: At the end of the transaction, neither the instance nor its state is valid (instance will be passivated and returned to the pool). Every client call causes an ejbActivate, ejbLoad, then the business method, then ejbStore, and ejbPassivate"
基于 6.3 的迁移指南
“在 JBoss EAP 5.x 中,还可以自定义缓存、池、提交选项,
和拦截器堆栈。在 JBoss EAP 6 中,这不再可能。只有一个
实现,类似于 Instance Per Transaction 策略
提交选项 C
感谢大家的支持 - 希望我的问题能帮助其他陷入类似问题的菜鸟。和平
我们正在从 jboss 4 迁移到 jboss 6。 Out 系统有大量的 EJB 2.1 bean。一旦我们在 jboss 6 中部署了应用程序,bean 就停止跨方法调用保留状态。
这正常吗?如果没有,可以做些什么来克服这个问题?
编辑:2015.08.04
Bean:有状态
我希望我可以分享 src 代码,但是公司有非常严格的政策。
根据您的经验提供任何指导或方向就足够了。
更多信息
场景:用户更新员工记录。
系统有一个 AbstractController,它执行单个记录更新。控制器查找 bean 并检索它的句柄。 然后,它使用反射检索方法名称。 然后设置一个标志 'isDirty' 为 true (setter inside the bean)
控制器然后通过调用 EJB 存储方法迭代更新每个字段的方法名称。在更新语句 运行 之前的存储方法中,检查标志 'isDirty'。
在 jboss 4 中,此标志保持为 'true',但当我们迁移到 6 时,此标志开始恢复为 false。
仅供参考:这是遗留资源,我真的希望我能改变逻辑,但我不能。
更新: 2015.08.04: 3pm
我在 ejb 激活和钝化方法中放置了一个断点。 bean 在被激活后立即被钝化。继续我的调查。将保持此线程更新。
更新:2015.08.20 我根据 EJB 规范和 运行 在 jboss 5.1 和 6.3
中构建了一个示例应用程序这两个实例是相同的。在方法调用之间,实体 bean 失去其状态
bean.doSomething();
bean.doSomethingElse();
结果
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
做了一些进一步的挖掘,我读到了这个
"Bean Provider 可以使用实例变量来存储依赖于持久状态的值 实体 bean 实例,尽管不鼓励这种使用。 Bean Provider 应该使用 ejbLoad 方法来重新同步依赖于实体 bean 的持久性的任何实例变量的值 状态。通常,任何依赖于实体 bean 的持久状态的非持久状态都应该是 在 ejbLoad 方法期间重新计算。"
换句话说,您负责在 ejbLoad 期间将 "isDirty" 设置为正确的状态。 您不应该期望它在一次调用和下一次调用之间保留任何特定值——如果确实如此,那只是因为 特定实现或意外。
经过很长一段时间后,我弄清楚了这种行为的原因。
基本上,在 jboss 6.3 中,他们只支持提交选项 3。
什么是提交选项? 它是我们在事务提交时对实体 bean 状态的控制。
什么是提交选项 3? "Pooled bean: At the end of the transaction, neither the instance nor its state is valid (instance will be passivated and returned to the pool). Every client call causes an ejbActivate, ejbLoad, then the business method, then ejbStore, and ejbPassivate"
基于 6.3 的迁移指南
“在 JBoss EAP 5.x 中,还可以自定义缓存、池、提交选项, 和拦截器堆栈。在 JBoss EAP 6 中,这不再可能。只有一个 实现,类似于 Instance Per Transaction 策略 提交选项 C
感谢大家的支持 - 希望我的问题能帮助其他陷入类似问题的菜鸟。和平