Weblogic域间调用EJB常见事务错误

http://blog.csdn.net/ivan0702/archive/2007/08/02/1722867.aspx

 

 

前言

 

    本人所在项目中,由于我们的系统将业务逻辑单独部署,以下称之为EJB层,和普通的WEB层相对独立。从 WEB 层调用 EJB 层,通过 Command 架构,其包含的 EJB 调用就是事务性质的,所以我们 EJB 层再调用其它第三方提供的 EJB 接口时,就经常会出现一些莫名其妙的错误,以下略作收集。

1 、

错误现象(在被调用的 EJB 服务器屏幕上出现):

 

<2005-1-20 下午 04 时 14 分 46 秒 CST> <Error> <Security> <BEA-090513> <ServerIdentity failed validation, downgrading to anonymous.>

<2005-1-20 下午 04 时 14 分 46 秒 CST> <Error> <JTA> <BEA-110200> <User [<anonymous>] is not authorized to invoke startCommit on a transaction branch.>

 

分析:

 

这种异常是跨域传播事务造成的 . 一定要传播事务的话 , 必须设置域信任 , 没有其他办法 . 但是域信任有相关的安全隐患 , 当然对于大部分非关键业务应用来说也无所谓了 .

具体设置方法为, domain node --> View Domain-wide Security Settings --> Configuration --> Advanced --> Enable Generated Credential --> 在 Credential 中输入密码,两个 domain 的这个密码要完全一致,然后重新启动 server 就可以了。

 

2 、

错误现象(在调用方的 EJB 屏幕上出现):

 

<2005-11-4 下午 01 时 41 分 36 秒 CST> <Error> <EJB> <BEA-010026> <Exception occurredduring commit of transaction Name=[EJB cn.com.jdls.foundation.architectures.comm

and.ejb.TaxCommandBean.executeCommand(cn.com.jdls.foundation.architectures.command.commands.BaseCommand)],Xid=BEA1-0021A70EC385C5407B0E(31591114),Status=Committing,numRepliesOwedMe=0,numRepliesOwedOthers=0,seconds since begin=121,seconds left=0,XAServerResourceInfo[weblogic.jdbc.wrapper.JTSXAResourceImpl]=(ServerResourceInfo[weblogic.jdbc.wrapper.JTSXAResourceImpl]=(state=committed,assigned=ejbserver),xar=weblogic.jdbc.wrapper.JTSXAResourceImpl@1326f69,re-Registered = false),SCInfo[mydomain+ejbserver]=(state=committed),SCInfo[dmctais+app1]=(state=committing),properties=({weblogic.transaction.name=[EJB cn.com.jdls.foundation.architectures.command.ejb.TaxCommandBean.executeCommand(cn.com.jdls.foundation.architectures.command.commands.BaseCommand)], weblogic.jdbc=t3://92.16.16.43:6517}),local properties=({modifiedListeners=[]}),OwnerTransactionManager=ServerTM[ServerCoordinatorDescriptor=(CoordinatorURL=ejbserver+92.16.16.43:6517+mydomain+t3+, XAResources={},NonXAResources={})],CoordinatorURL=ejbserver+92.16.16.43:6517+mydomain+t3+): javax.transaction.SystemException: Timeout during commit processing

 

 

分析:

 

这种异常是由于 EJB 被调用方,通常具有记忆功能,对于调用它接口的远程 EJB 服务和相应的 IP 以及 Port 都会记录在内存,如果下次相同的 EJB 服务来调用它的时候,它就会检测内存中该 EJB 服务对应的 IP/Port 是否和当前的实际情况相符,如果不符的话,就会出现这种错误。

这种情况目前在我们系统中,碰到的两种典型的案例就是:

 

一,我们的 EJB 服务器上有双网卡,本来调用 某第三方 的 EJB 接口很正常,但是有次禁用了其中一个没插网线的网卡后,就出现这种错误,因为被调用方 EJB 服务已经记住了我们的 EJB 服务对应的 IP 和 Port ;

 

二、本来我们的 EJB 服务器,调用另一个 第三方 EJB 接口也很正常,但是有次为了测试的需要,又在另外一台服务器上,复制了一份完全一样的系统环境,也连接到同一个第三方EJB 测试服务器进行测试,结果后一台调用的时候就出现了这种错误,因为被调用方 EJB 服务已经记住了我们的 EJB 服务,其对应的 IP/Port 应该是前一台服务器。

 

对于这种情况,简单的处理办法就是,将被调用方的 EJB 服务重启一下,则它内存中的记录就会清除,下次就会记住最新的 EJB 服务和相应的 IP/Port 。

但是针对我们 系统来说,通常我们系统调用的第三方的 EJB 接口, 往往不能随便重启 第三方服务,所以变通的办法,就是将要使用的我们系统中,将涉及到的 每个 WEBLOGIC 域服务器对应的 server 名字都改掉,这样被调用方就不会在内存中找到相应的记录,因此也就不会出现这种莫名的调用出错问题。同时将域根目录下的临时目录全部删除,再重新启动服务应该即可生效。

 

总结
以上所述都是本人所在项目碰到的问题,可能并不一定具有共性,也不全面,所以大家碰到的莫名其妙的错误,也希望贴出来,共享看看 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值