哎诤

从此不能再哎诤--无聊的人,喜欢无病呻吟
posts - 11, comments - 11, trackbacks - 0, articles - 0
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

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

Posted on 2006-04-29 16:21 哎诤 阅读(5191) 评论(2)  编辑  收藏 所属分类: j2ee范畴

前言

    本人所在项目中,由于我们的系统将业务逻辑单独部署,以下称之为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 名字都改掉,这样被调用方就不会在内存中找到相应的记录,因此也就不会出现这种莫名的调用出错问题。 同时将域根目录下的临时目录全部删除,再重新启动服务应该即可生效。

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


评论

# re: Weblogic域间调用EJB常见事务错误  回复  更多评论   

2008-08-25 14:45 by susu
这篇文章帮了我很大的忙,谢了。^_^

# re: Weblogic域间调用EJB常见事务错误  回复  更多评论   

2014-06-09 11:31 by 小笨
这篇文章帮了我很大的忙,谢了。^_^

只有注册用户登录后才能发表评论。


网站导航: