快速业务通道

Weblogic中因为IP变更导致SubCoordinator not available,Transaction Rollba - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-22
next中一般包括如下信息:

Xid: 事务ID

CoordinatorURL: 事务主coordinator的URL(最终事务提交在对应的server上完成)

scURLs: subcoordinator url列表,每个involve到该tx中的server url都在其中。coordinator通过这个url通知每个subcoordinator完成事务的提交、回滚。

resNames: involve到该tx中所以resource的名字列表

......

从异常上来看,这个问题跟subCoordinator有关,所以在客户端,我只debug了scURLs,如下,

从debug信息来看,server2的scURL应该是没有问题的。回头再看看这个异常,因为异常是在客户端发起提交请求的时候,server端抛出的,问题是,我传递过去的是个正确的scURL(192.168.0.51),server端怎么会解析出一个错误的 url(10.182.216.189)呢?

继续debug server端,server端收到coordinatorImpl_stub的commit()时,它需要先从PropagationContext中 restore transaction信息,包括根据scURLs还原scInfoList, 根据resNames还原resourceInfoList。问题出在了还原scInfoList的时候。如下:

1       if (scURLs != null) { 2             for (int i = 0; i < scURLs.length; i++) { 3                 String scURL = scURLs[i]; 4                 if (tm.isLocalCoordinator(scURL)) continue; 5                 SCInfo sci = tx.getOrCreateSCInfo(scURL); 6                 sci.setState(scStates[i]); 7                 if (scSyncRegs[i] == 1) sci.setSyncRegistered(true); 8             } 9       }

Weblogic中因为IP变更导致SubCoordinator not available,Transaction Rollba(2)

时间:2010-12-26 BlogJava 走走停停又三年

也就是说,PropagationContext还原事务的时候会遍历每个scURL,如果是个local的url,则忽略它,否则会要求tx检查该scURL对应的scInfo是否已经存在于tx自己的scInfoList中。再罗索一句,weblogic中,无论server端,还是 client端,都会将tx保存在当前TransactionManager的txMap中,PropagationContext还原tx的时候,首先检查xid对应的tx是否存在于txMap中,没有的话,它会负责创建一个tx。再看看tx.getOrCreateSCInfo(scURL)是怎么工作的,

1   SCInfo getOrCreateSCInfo(String scURL) { 2         if (scInfoList != null) { 3               for (int i = 0; i < scInfoList.size(); i++) { 4                     SCInfo sci = (SCInfo) scInfoList.get(i); 5                     if (sci.getCoordinatorDescriptor().representsCoordinatorURL(scURL)) { 6                           return sci; 7                     } 8               } 9         } 10         SCInfo sci = createSCInfo(scURL); 11         addSC(sci); 12         return sci; 13   }

它也是遍历自己手里的scInfoList,如果发现list中某个对象和传递进来的scURL匹配,则返回这个对象,否则它创建一个新的scInfo, 把它放入scInfoList并返回。那么它是怎么判断匹配与否的呢?

1  final boolean representsCoordinatorURL(String aCoURL) 2   { 3     return getServerID().equals(getServerID(aCoURL)); 4   }

匹配的依据就是ServerID相等,serveId是什么?其实就是DomainNam

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号