前言
本人所在项目中,由于我们的系统将业务逻辑单独部署,以下称之为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
名字都改掉,这样被调用方就不会在内存中找到相应的记录,因此也就不会出现这种莫名的调用出错问题。
同时将域根目录下的临时目录全部删除,再重新启动服务应该即可生效。
总结
以上所述都是本人所在项目碰到的问题,可能并不一定具有共性,也不全面,所以大家碰到的莫名其妙的错误,也希望贴出来,共享看看