前言
??? 本人所在項目中,由于我們的系統將業務邏輯單獨部署,以下稱之為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
名字都改掉,這樣被調用方就不會在內存中找到相應的記錄,因此也就不會出現這種莫名的調用出錯問題。
同時將域根目錄下的臨時目錄全部刪除,再重新啟動服務應該即可生效。
總結
以上所述都是本人所在項目碰到的問題,可能并不一定具有共性,也不全面,所以大家碰到的莫名其妙的錯誤,也希望貼出來,共享看看?