gpt4 book ai didi

migration - EJB 2.1 不会在 jboss 6.3 中跨方法调用保留状态

转载 作者:行者123 更新时间:2023-12-04 21:38:54 25 4
gpt4 key购买 nike

我们正在从 jboss 4 迁移到 jboss 6。
Out 系统有大量的 EJB 2.1 bean。一旦我们在 jboss 6 中部署了应用程序,bean 就停止在方法调用之间保存状态。

这是正常的吗?如果没有,可以做些什么来克服这个问题?

编辑:2015.08.04

Bean:有状态

我希望我可以分享 src 代码,但是,该公司有非常严格的政策。

任何来自您的经验的指导或指示就足够了。

更多信息

场景:用户更新员工记录。

系统有一个 AbstractController 可以进行单条记录更新。 Controller 查找 bean 并检索它的句柄。
然后,它使用反射检索方法名称。
然后将标志 'isDirty' 设置为 true(bean 内的 setter)

然后 Controller 通过调用 EJB 存储方法迭代更新每个字段的方法名称。在运行更新语句之前的 store 方法中,检查标志“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 中,他们只支持 commit-option 3。

什么是提交选项?
它是我们在事务提交时对实体 bean 状态的控制。

什么是提交选项 3?
“池化 bean:在事务结束时,实例及其状态都无效(实例将被钝化并返回到池中)。每个客户端调用都会导致 ejbActivate、ejbLoad,然后是业务方法,然后是 ejbStore 和 ejbPassivate ”

基于 6.3 的迁移指南

“在 JBoss EAP 5.x 中,还可以自定义缓存、池化、提交选项、
和拦截器堆栈。在 JBoss EAP 6 中,这不再可能。只有一个
实现,类似于 Instance Per Transaction 策略
提交选项 C"

感谢大家的支持 - 希望我的问题能帮助其他陷入类似问题的菜鸟。和平

关于migration - EJB 2.1 不会在 jboss 6.3 中跨方法调用保留状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31785359/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com