Weblogic 14.1.2.0.0:使用Foreign JNDI调用远程EJB时XA事务提交失败
环境背景
- 两个WebLogic 14.1.2域(均命名为
base_domain,分别运行在9001和8001端口)。 - Agency域(9001端口)部署了一个MDB,该MDB执行以下操作:
- 从本地XA队列消费消息;
- 向多个表写入数据(使用XA数据源);
- 通过Foreign Server(
FactoryConnectionAirline→jmsremote/connectionFactoryAirline(本地JNDI)→jms/connectionFactory(远程JNDI))向Airline域(8001端口)的远程队列发送消息。
整个流程需作为单个XA/两阶段提交事务执行。
已尝试的解决方案
- 跨域安全配置
- 两个域均设置
CrossDomainSecurityEnabled = true; - 将用户
xdUser添加到CrossDomainConnectors组; - 双向创建凭据映射,执行命令:
createCredMapCredential('base_domain', 'xdUser', 'xdUser', 'password1$', 'Cross-domain') - 日志显示:
<Security> Cross-domain authentication succeeded for user xdUser from domain base_domain
- 两个域均设置
- 远程连接工厂(Airline域)
- 设置
One-Way Send Mode = disabled; - 设置
One-Way Window Size = 1;
- 设置
- 本地连接工厂(Agency域)
- 设置
Blocking Send Policy = Block;
- 设置
- JMS存储
- 设置
Synchronous Write Policy = Direct-Write; - 队列和存储部署在本地SSD上;
- 设置
- 所有数据源均设置为两阶段提交;无LLR数据源;
- 将JTA超时时间增加至120秒;
- 启用DebugJTA2PC, DebugJTAXA, DebugJMSStore进行跟踪;
问题现象
执行commit操作时仍出现以下错误:
<2025年7月15日 中欧夏令时下午1:01:49,284> <错误> <EJB> <BEA-010026> <事务提交期间发生异常,事务名称=[EJB domainevent.consumer.DomainEventConsumerOrchestator.onMessage(javax.jms.Message)],Xid=BEA1-00087BE481DF3057A4BD(341918243),状态=已回滚。[原因=javax.transaction.SystemException: 仅当没有等待响应的请求时才能提交。当前存在一个此类请求],numRepliesOwedMe=1,numRepliesOwedOthers=0,事务开始后秒数=0,剩余秒数=30,useSecure=false,XAServerResourceInfo[WLStore_base_domain__WLS_AdminServer]=(ServerResourceInfo[WLStore_base_domain__WLS_AdminServer]=(state=rolledback,assigned=AdminServer),xar=WLStore_base_domain__WLS_AdminServer598849144,re-Registered = false),SCInfo[base_domain+AdminServer]=(state=rolledback),properties=({weblogic.transaction.name=[EJB domainevent.consumer.DomainEventConsumerOrchestator.onMessage(javax.jms.Message)]}),OwnerTransactionManager=ServerTM[ServerCoordinatorDescriptor=(CoordinatorURL=AdminServer+172.21.48.1:9001+base_domain+t3+ CoordinatorNonSecureURL=AdminServer+172.21.48.1:9001+base_domain+t3+ coordinatorSecureURL=null, XAResources={PoolAgencyErrorQueue_base_domain, PoolMsaCountry_base_domain, WSATGatewayRM_AdminServer_base_domain, PoolMsaTravel_base_domain, PoolMsaUser_base_domain, WLStore_base_domain__WLS_AdminServer, PoolMsaTypeUser_base_domain, PoolMTAAgency_base_domain},NonXAResources={})],CoordinatorURL=AdminServer+172.21.48.1:9001+base_domain+t3+): weblogic.transaction.RollbackException: 仅当没有等待响应的请求时才能提交。当前存在一个此类请求 at weblogic.transaction.internal.TransactionImpl.throwRollbackException(TransactionImpl.java:2122) at weblogic.transaction.internal.ServerTransactionImpl.internalCommit(ServerTransactionImpl.java:384) at weblogic.transaction.internal.ServerTransactionImpl.commit(ServerTransactionImpl.java:270) at weblogic.ejb.container.internal.MDListener.execute(MDListener.java:487) at weblogic.ejb.container.internal.MDListener.transactionalOnMessage(MDListener.java:370) at weblogic.ejb.container.internal.MDListener.onMessage(MDListener.java:306) at weblogic.jms.client.JMSSession.onMessage(JMSSession.java:5172) at weblogic.jms.client.JMSSession.execute(JMSSession.java:4820) at weblogic.jms.client.JMSSession.executeMessage(JMSSession.java:4214) at weblogic.jms.client.JMSSession$UseForRunnable.run(JMSSession.java:5707) at weblogic.work.SelfTuningWorkManagerImpl$WorkAdapterImpl.run(SelfTuningWorkManagerImpl.java:691) at weblogic.invocation.ComponentInvocationContextManager._runAs(ComponentInvocationContextManager.java:352) at weblogic.invocation.ComponentInvocationContextManager.runAs(ComponentInvocationContextManager.java:337) at weblogic.work.LivePartitionUtility.doRunWorkUnderContext(LivePartitionUtility.java:60) at weblogic.work.PartitionUtility.runWorkUnderContext(PartitionUtility.java:41) at weblogic.work.SelfTuningWorkManagerImpl.runWorkUnderContext(SelfTuningWorkManagerImpl.java:665) at weblogic.work.ExecuteThread.execute(ExecuteThread.java:430) at weblogic.work.ExecuteThread.run(ExecuteThread.java:370) Caused by: javax.transaction.SystemException: 仅当没有等待响应的请求时才能提交。当前存在一个此类请求 at weblogic.transaction.internal.TransactionImpl.abort(TransactionImpl.java:1305) at weblogic.transaction.internal.TransactionImpl.enforceCheckedTransaction(TransactionImpl.java:2051) at weblogic.transaction.internal.TransactionImpl.checkIfCommitPossible(TransactionImpl.java:2028) at weblogic.transaction.internal.ServerTransactionImpl.internalCommit(ServerTransactionImpl.java:295) ... 16 more .>
内容的提问来源于stack exchange,提问作者Jose Villacres
相关产品推荐
相关产品推荐

