【问题标题】:Weblogic EJB can not commit XA transaction when use Foreign JNDI to call remote EJB使用 Foreign JNDI 调用远程 EJB 时 Weblogic EJB 无法提交 XA 事务
【发布时间】:2014-01-14 15:25:04
【问题描述】:

目前我正在使用 Weblogic 12.1.2 DEV 版本进行 EJB 开发。我需要调用一个远程 EJB(另一个 Weblogic 服务器)。所以我配置了一个指向这个远程 EJB 的 Foreign JNDI Provider。一切都很好,直到我的本地 EJB bean 尝试提交事务,我得到以下异常:

<Dec 27, 2013 10:23:51 AM CST> <Error> <EJB> <BEA-010026> <Exception occurred during commit of transaction Name=[EJB test.bean.HelloBean.hello()],Xid=BEA1-00022F80B0CCE5A4E067(808603218),Status=Rolled back. [Reason=javax.transaction.SystemException: Commit can be issued only when there are no requests awaiting responses. Currently there is one such request],numRepliesOwedMe=1,numRepliesOwedOthers=0,seconds since begin=21,seconds left=30,SCInfo[domain1+AdminServer]=(state=rolledback),properties=({weblogic.transaction.name=[EJB test.bean.HelloBean.hello()]}),OwnerTransactionManager=ServerTM[ServerCoordinatorDescriptor=(CoordinatorURL=AdminServer+10.136.0.15:7001+domain1+t3+, XAResources={dev/sqlserver_domain1, WSATGatewayRM_AdminServer_domain1, local/sqlserver_domain1},NonXAResources={})],CoordinatorURL=AdminServer+10.136.0.15:7001+domain1+t3+): weblogic.transaction.RollbackException: Commit can be issued only when there are no requests awaiting responses. Currently there is one such request
    at weblogic.transaction.internal.TransactionImpl.throwRollbackException(TransactionImpl.java:1878)
    at weblogic.transaction.internal.ServerTransactionImpl.internalCommit(ServerTransactionImpl.java:359)
    at weblogic.transaction.internal.ServerTransactionImpl.commit(ServerTransactionImpl.java:250)
    at weblogic.ejb.container.internal.BaseRemoteObject.postInvoke1(BaseRemoteObject.java:374)
    at weblogic.ejb.container.internal.StatelessRemoteObject.postInvoke1(StatelessRemoteObject.java:20)
    at weblogic.ejb.container.internal.BaseRemoteObject.__WL_postInvokeTxRetry(BaseRemoteObject.java:226)
    at weblogic.ejb.container.internal.SessionRemoteMethodInvoker.invoke(SessionRemoteMethodInvoker.java:47)
    at test.bean.HelloBean_gbyfgg_HelloImpl.hello(Unknown Source)
    at test.bean.HelloBean_gbyfgg_HelloImpl_WLSkel.invoke(Unknown Source)
    at weblogic.rmi.internal.BasicServerRef.invoke(BasicServerRef.java:693)
    at weblogic.rmi.cluster.ClusterableServerRef.invoke(ClusterableServerRef.java:230)
    at weblogic.rmi.internal.BasicServerRef$1.run(BasicServerRef.java:519)
    at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:363)
    at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:146)
    at weblogic.rmi.internal.BasicServerRef.handleRequest(BasicServerRef.java:515)
    at weblogic.rmi.internal.wls.WLSExecuteRequest.run(WLSExecuteRequest.java:118)
    at weblogic.work.ExecuteThread.execute(ExecuteThread.java:295)
    at weblogic.work.ExecuteThread.run(ExecuteThread.java:254)
Caused by: javax.transaction.SystemException: Commit can be issued only when there are no requests awaiting responses. Currently there is one such request
    at weblogic.transaction.internal.TransactionImpl.abort(TransactionImpl.java:1151)
    at weblogic.transaction.internal.TransactionImpl.enforceCheckedTransaction(TransactionImpl.java:1809)
    at weblogic.transaction.internal.TransactionImpl.checkIfCommitPossible(TransactionImpl.java:1787)
    at weblogic.transaction.internal.ServerTransactionImpl.internalCommit(ServerTransactionImpl.java:275)
    ... 16 more
.> 

在我添加这个远程 EJB 调用之前,应用程序正在调用两个带有 weblogic 提供的 no-xa JDBC 驱动程序的 sql server 实例。但是,它们通过启用模拟两阶段提交来支持全局事务。该应用程序在提交或回滚时运行良好。将此远程 EJB 调用添加到进程中后,XA 事务不能再提交。知道如何解决这个问题吗?

【问题讨论】:

    标签: transactions ejb weblogic xa


    【解决方案1】:

    您有三个选项,您应该根据您的非功能性要求(例如安全性等)决定哪一个最好:

    • 在所有域之间启用全局域信任 - 基本上您将所有域上的域凭据设置为相同的值
    • 启用跨域安全 - 您在双方创建用户,将他们添加到 cross-domain-connectors 组,定义跨域凭据映射并在域配置中启用跨域安全
    • 将域互操作模式更改为在所有域上执行 - 这将导致事务协调器使用匿名登录

    我尝试了后者,它们都有效。如果您从上面搜索关键字,您可以找到更多详细信息 - 以上所有案例都有一些基本的 weblogic 文档。

    您可能还希望在尝试使其工作时使用控制台启用事务日志记录。它打印了很多信息,其中一些可能有用。

    【讨论】:

      【解决方案2】:

      远程 ejb 调用是否成功完成或是否引发异常/此远程 ejb 调用代表同一事务执行。

      【讨论】:

      • 远程ejb调用成功完成,但似乎不在同一个事务中。我徘徊为什么,或者我错过了什么。
      • 远程 ejb 调用执行什么操作,尤其是在数据库事务方面? ejb 调用是否有可能尝试提交。请注意,您仅使用模拟 xa,它不能保证事务回滚。
      • 远程ejb调用是在DB中创建一条记录。但是在抛出这个异常之后,记录仍然在数据库中。这就是为什么我相信远程 ejb 调用不在同一个事务中的原因。另一件事是,我没有启用跨域安全性。我只是使用全球信任来做到这一点。我做得对吗?
      • 这意味着远程 ejb 调用正在提交,这违反了模拟 2PC 协议。
      • 这很奇怪。无论如何,我终于得到了这个工作。以下是步骤: 1. 启用 weblogic Cross Domain Security。 2. 将安全互操作性模式更改为兼容性 3. 将凭据添加到默认用户“weblogic” 4. 运行 MS DTC 服务参考msdn.microsoft.com/en-us/library/aa342335.aspx 现在我正在使用 MS 提供的 XA JDBC 驱动程序来使分发事务正常工作。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-30
      • 1970-01-01
      相关资源
      最近更新 更多