我们正在从jboss 4迁移到jboss 6。 Out系统有大量的EJB 2.1 bean。一旦我们在jboss 6中部署了应用程序,bean就会停止在方法调用中保持状态。
这是正常的吗?如果没有,可以做些什么来克服这个问题?
修改:2015年8月4日
Bean:有状态
我希望我能分享src代码,但公司有非常严格的政策。
根据您的经验提供的指导或指导就足够了。
更多信息
场景:用户更新员工记录。
系统有一个AbstractController,可以进行单一记录更新。控制器查找bean并检索它的句柄。 然后,使用反射它检索方法名称。 然后将标志'isDirty'设置为true(bean内的setter)
然后,控制器通过调用EJB存储方法迭代更新每个字段的方法名称。在运行update语句之前的store方法中,检查标志'isDirty'。
在jboss 4中,此标志保持为“true”,但是当我们迁移到6时,此标志开始恢复为false。
仅供参考:这是遗产来源,我真的希望我能改变逻辑,但我不能。
更新:2015.08.04:3pm
我在ejb activate和passivate方法中放置了一个断点。豆子在被激活后立即被钝化。继续我的调查。将保持此线程更新。
更新: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”设置为正确的状态。 您不应该期望它从一次调用到下一次调用时保留任何特定值 - 如果是,那只是因为 特定实施或偶然的。
答案 0 :(得分:0)
过了一会儿,我想出了这种行为的原因。
基本上,在jboss 6.3中,他们只支持commit-option 3。
什么是提交选项? 它是我们在事务提交时对实体bean状态的控制。
什么是commit-option 3? “池化bean:在事务结束时,实例及其状态都不是有效的(实例将被钝化并返回池中。)每个客户端调用都会生成ejbActivate,ejbLoad,然后是业务方法,然后是ejbStore,以及ejbPassivate “
基于6.3的迁移指南
“在JBoss EAP 5.x中,还可以自定义缓存,池化,提交选项, 和拦截器堆栈。在JBoss EAP 6中,这已不再可能。只有一个 实现,类似于每个事务的实例策略 commit-option C“
谢谢大家的支持 - 希望我的问题可以帮助其他类似问题的新手。和平