【问题标题】:Oracle AQ JMS with XA transaction throwing NullPointException while fetching connectionOracle AQ JMS 与 XA 事务在获取连接时抛出 NullPointException
【发布时间】:2017-02-28 07:25:37
【问题描述】:

我正在尝试使用支持 XA 事务的 Oracle AQ,因为我有其他数据源,如 Active MQ 和 DB 参与事务。当我试图发布到 oracle aq queue1.从数据源获取 XAconnection 时出现 NullPointerException 失败。

我用的是oracle ojdbc6,aqapi.jar 11.2版本 下面给出了我的 bean 定义的骆驼蓝图的片段

<reference id="transactionManager" interface="javax.transaction.TransactionManager" />
<reference id="recoverableTxManager" interface="org.apache.geronimo.transaction.manager.RecoverableTransactionManager" availability="mandatory" />
<reference id="platformTxManager" interface="org.springframework.transaction.PlatformTransactionManager" availability="mandatory"/>


<bean id="oracleXaDataSource" class="oracle.jdbc.xa.client.OracleXADataSource" destroy-method="close">
    <property name="user" value="dbuser" />
    <property name="password" value="dbpassword" />
    <property name="URL" value="dburl" />
</bean>

<bean id="connectionFactoryOracleAQ" class="oracle.jms.AQjmsFactory" factory-method="getXAQueueConnectionFactory">
    <argument value="oracleXaDataSource" />
</bean>

<bean id="oracleaqJcaPooledConnectionFactory" class="org.apache.activemq.jms.pool.JcaPooledConnectionFactory" init-method="start"
      destroy-method="stop">
    <property name="idleTimeout" value="0"/>
    <property name="name" value="aq.default"/>
    <property name="maxConnections" value="1"/>
    <property name="connectionFactory" ref="connectionFactoryOracleAQ"/>
    <property name="transactionManager" ref="transactionManager"/>
</bean>

<bean id="resourceManager-AQ" class="org.apache.activemq.jms.pool.GenericResourceManager"
      init-method="recoverResource">
    <property name="connectionFactory" ref="connectionFactoryOracleAQ"/>
    <property name="transactionManager" ref="recoverableTxManager"/>
    <property name="resourceName" value="aq.default"/>
    <property name="userName" value="${primary.datasource.user}"/>
    <property name="password" value="${primary.datasource.password}"/>
</bean>

<bean id="oracleaqJmsConfig" class="org.apache.camel.component.jms.JmsConfiguration">
    <property name="connectionFactory" ref="oracleaqJcaPooledConnectionFactory"/>
    <property name="transactionManager" ref="platformTxManager"/>
    <property name="transacted" value="false"/>
</bean>

<bean id="oracleaq" class="org.apache.camel.component.jms.JmsComponent">
    <property name="connectionFactory" ref="oracleaqJmsConfig" />
</bean>


<camelContext xmlns="http://camel.apache.org/schema/blueprint">
    <route id="route1">
        <from uri="vm:route1" />
            <log message="Message to the oracle Aq:queue1-- ${body}" />
            <to uri="oracleaq:queue:queue1?jmsMessageType=Text" pattern="InOnly"/>
    </route>
</camelContext>

您能帮我找出问题所在吗?异常给出 l

2017-02-27 12:14:11,613 | WARN  | loyer-4-thread-1 | PooledConnectionFactory          | 9037 - org.apache.activemq.activemq-osgi - 5.11.0.redhat-621084 | Create pooled connection during start failed. This exception will be ignored.
javax.jms.JMSException: Error while attempting to add new Connection to the pool
    at org.apache.activemq.jms.pool.PooledConnectionFactory.createJmsException(PooledConnectionFactory.java:267)
    at org.apache.activemq.jms.pool.PooledConnectionFactory.createConnection(PooledConnectionFactory.java:226)
    at org.apache.activemq.jms.pool.PooledConnectionFactory.createConnection(PooledConnectionFactory.java:205)
    at org.apache.activemq.jms.pool.PooledConnectionFactory.start(PooledConnectionFactory.java:291)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)[:1.7.0_25]
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)[:1.7.0_25]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)[:1.7.0_25]
    at java.lang.reflect.Method.invoke(Method.java:606)[:1.7.0_25]
    at org.apache.aries.blueprint.utils.ReflectionUtils.invoke(ReflectionUtils.java:299)[15:org.apache.aries.blueprint.core:1.4.4]
    at org.apache.aries.blueprint.container.BeanRecipe.invoke(BeanRecipe.java:956)[15:org.apache.aries.blueprint.core:1.4.4]
    at org.apache.aries.blueprint.container.BeanRecipe.runBeanProcInit(BeanRecipe.java:712)[15:org.apache.aries.blueprint.core:1.4.4]
    at org.apache.aries.blueprint.container.BeanRecipe.internalCreate2(BeanRecipe.java:824)[15:org.apache.aries.blueprint.core:1.4.4]
    at org.apache.aries.blueprint.container.BeanRecipe.internalCreate(BeanRecipe.java:787)[15:org.apache.aries.blueprint.core:1.4.4]
    at org.apache.aries.blueprint.di.AbstractRecipe$1.call(AbstractRecipe.java:79)[15:org.apache.aries.blueprint.core:1.4.4]
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)[:1.7.0_25]
    at java.util.concurrent.FutureTask.run(FutureTask.java:166)[:1.7.0_25]
    at org.apache.aries.blueprint.di.AbstractRecipe.create(AbstractRecipe.java:88)[15:org.apache.aries.blueprint.core:1.4.4]
    at org.apache.aries.blueprint.container.BlueprintRepository.createInstances(BlueprintRepository.java:247)[15:org.apache.aries.blueprint.core:1.4.4]
    at org.apache.aries.blueprint.container.BlueprintRepository.createAll(BlueprintRepository.java:183)[15:org.apache.aries.blueprint.core:1.4.4]
    at org.apache.aries.blueprint.container.BlueprintContainerImpl.instantiateEagerComponents(BlueprintContainerImpl.java:682)[15:org.apache.aries.blueprint.core:1.4.4]
    at org.apache.aries.blueprint.container.BlueprintContainerImpl.doRun(BlueprintContainerImpl.java:377)[15:org.apache.aries.blueprint.core:1.4.4]
    at org.apache.aries.blueprint.container.BlueprintContainerImpl.run(BlueprintContainerImpl.java:269)[15:org.apache.aries.blueprint.core:1.4.4]
    at org.apache.aries.blueprint.container.BlueprintExtender.createContainer(BlueprintExtender.java:294)[15:org.apache.aries.blueprint.core:1.4.4]
    at org.apache.aries.blueprint.container.BlueprintExtender.createContainer(BlueprintExtender.java:263)[15:org.apache.aries.blueprint.core:1.4.4]
    at org.apache.aries.blueprint.container.BlueprintExtender.modifiedBundle(BlueprintExtender.java:253)[15:org.apache.aries.blueprint.core:1.4.4]
    at org.apache.aries.util.tracker.hook.BundleHookBundleTracker$Tracked.customizerModified(BundleHookBundleTracker.java:500)[9:org.apache.aries.util:1.1.0]
    at org.apache.aries.util.tracker.hook.BundleHookBundleTracker$Tracked.customizerModified(BundleHookBundleTracker.java:433)[9:org.apache.aries.util:1.1.0]
    at org.apache.aries.util.tracker.hook.BundleHookBundleTracker$AbstractTracked.track(BundleHookBundleTracker.java:725)[9:org.apache.aries.util:1.1.0]
    at org.apache.aries.util.tracker.hook.BundleHookBundleTracker$Tracked.bundleChanged(BundleHookBundleTracker.java:463)[9:org.apache.aries.util:1.1.0]
    at org.apache.aries.util.tracker.hook.BundleHookBundleTracker$BundleEventHook.event(BundleHookBundleTracker.java:422)[9:org.apache.aries.util:1.1.0]
    at org.apache.felix.framework.util.SecureAction.invokeBundleEventHook(SecureAction.java:1127)[org.apache.felix.framework-4.4.1.jar:]
    at org.apache.felix.framework.util.EventDispatcher.createWhitelistFromHooks(EventDispatcher.java:696)[org.apache.felix.framework-4.4.1.jar:]
    at org.apache.felix.framework.util.EventDispatcher.fireBundleEvent(EventDispatcher.java:484)[org.apache.felix.framework-4.4.1.jar:]
    at org.apache.felix.framework.Felix.fireBundleEvent(Felix.java:4429)[org.apache.felix.framework-4.4.1.jar:]
    at org.apache.felix.framework.Felix.startBundle(Felix.java:2100)[org.apache.felix.framework-4.4.1.jar:]
    at org.apache.felix.framework.BundleImpl.start(BundleImpl.java:976)[org.apache.felix.framework-4.4.1.jar:]
    at org.apache.felix.framework.BundleImpl.start(BundleImpl.java:963)[org.apache.felix.framework-4.4.1.jar:]
    at io.fabric8.agent.service.Agent$BaseDeployCallback.startBundle(Agent.java:482)[86:io.fabric8.fabric-agent:1.2.0.redhat-621084]
    at io.fabric8.agent.service.Deployer$3.call(Deployer.java:935)[86:io.fabric8.fabric-agent:1.2.0.redhat-621084]
    at io.fabric8.agent.service.Deployer$3.call(Deployer.java:930)[86:io.fabric8.fabric-agent:1.2.0.redhat-621084]
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)[:1.7.0_25]
    at java.util.concurrent.FutureTask.run(FutureTask.java:166)[:1.7.0_25]
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)[:1.7.0_25]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)[:1.7.0_25]
    at java.lang.Thread.run(Thread.java:724)[:1.7.0_25]
Caused by: oracle.jms.AQjmsException: Error creating the db_connection
    at oracle.jms.AQjmsDBConnMgr.getConnection(AQjmsDBConnMgr.java:625)
    at oracle.jms.AQjmsDBConnMgr.<init>(AQjmsDBConnMgr.java:458)
    at oracle.jms.AQjmsXAConnection.<init>(AQjmsXAConnection.java:129)
    at oracle.jms.AQjmsXAConnectionFactory.createXAConnection(AQjmsXAConnectionFactory.java:212)
    at org.apache.activemq.jms.pool.XaPooledConnectionFactory.createConnection(XaPooledConnectionFactory.java:79)
    at org.apache.activemq.jms.pool.PooledConnectionFactory$1.makeObject(PooledConnectionFactory.java:108)
    at org.apache.activemq.jms.pool.PooledConnectionFactory$1.makeObject(PooledConnectionFactory.java:88)
    at org.apache.commons.pool.impl.GenericKeyedObjectPool.addObject(GenericKeyedObjectPool.java:1748)
    at org.apache.activemq.jms.pool.PooledConnectionFactory.createConnection(PooledConnectionFactory.java:222)
    ... 43 more
Caused by: java.lang.NullPointerException
    at oracle.jms.AQjmsGeneralDBConnection.getProviderKey(AQjmsGeneralDBConnection.java:99)
    at oracle.jms.AQjmsGeneralDBConnection.<init>(AQjmsGeneralDBConnection.java:77)
    at oracle.jms.AQjmsDBConnMgr.getConnection(AQjmsDBConnMgr.java:541)
    ... 51 more

【问题讨论】:

  • 您是否尝试过将您的maxConnections 设置为大于1 的值?
  • 是的,我做到了。我想我明白了问题所在。让我把它贴在下面

标签: oracle apache-camel jms blueprint


【解决方案1】:

我想我明白了问题所在。我从 oracle 11.2 客户端使用的 aqapi.jar 有错误。 AqjmsGeneralDBConnection 类没有为 QAConnection 初始化 m_dbConn 对象(以 XAConnection 作为参数的构造函数),并试图访问为空的 m_dbConn 对象上的 getURL()。我尝试使用 10.2.0 版本的 aqapi13.jar,它可以工作

AQjmsGeneralDBConnection(AQjmsDBConnMgr paramAQjmsDBConnMgr, Connection paramConnection, boolean paramBoolean1, boolean paramBoolean2)
    throws JMSException
  {
    this.m_connMgr = paramAQjmsDBConnMgr;
    this.m_dbConn = paramConnection;
    this.m_isExternal = paramBoolean1;
    this.m_force = paramBoolean2;

    this.providerKey = getProviderKey();
  }


  AQjmsGeneralDBConnection(AQjmsDBConnMgr paramAQjmsDBConnMgr, XAConnection paramXAConnection, boolean paramBoolean1, boolean paramBoolean2)
    throws JMSException
  {
    this.m_connMgr = paramAQjmsDBConnMgr;
    this.m_xaConn = paramXAConnection;
    this.m_isExternal = paramBoolean1;
    this.m_force = paramBoolean2;

    this.providerKey = getProviderKey();
  }



private String getProviderKey()
    throws JMSException
  {
    try
    {
      OracleConnection localOracleConnection = (OracleConnection)this.m_dbConn;
      **String str1 = localOracleConnection.getURL();**

      int i = str1.indexOf('@');
      String str2;
      if (i < 0)
      {
        if ((!"jdbc:oracle:kprb:".equals(str1)) && (!"jdbc:default:connection:".equals(str1))) {
          AQjmsError.throwEx(112);
        }
        str2 = "jdbc:oracle:kprb:";
      }
      else
      {
        str2 = str1.substring(i);
      }
      return str2.toUpperCase();
    }
    catch (SQLException localSQLException)
    {
      throw new AQjmsException(localSQLException);
    }
  }

【讨论】:

    猜你喜欢
    • 2011-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多