【问题标题】:jboss eap error org.jboss.jca.adapters.jdbc.jdk8.WrappedConnectionJDK8 cannot be cast to oracle.jdbc.internal.OracleConnectionjboss eap 错误 org.jboss.jca.adapters.jdbc.jdk8.WrappedConnectionJDK8 无法转换为 oracle.jdbc.internal.OracleConnection
【发布时间】:2020-09-15 14:01:48
【问题描述】:

我正在开发骆驼路线以连接到 Jboss EAP Fuse 上的 Oracle AQ。 我设法使用连接工厂来做到这一点,如下所示:

<bean class="org.apache.camel.component.jms.JmsComponent" id="oracleAQQueue">
    <property name="connectionFactory" ref="oracleQueueAQCredentials"/>
</bean>
<bean
    class="org.springframework.jms.connection.UserCredentialsConnectionFactoryAdapter"
    id="oracleQueueAQCredentials" primary="true">
    <property name="targetConnectionFactory">
        <ref bean="connectionFactoryOracleAQAQQueue"/>
    </property>
</bean>
<bean class="oracle.jms.AQjmsFactory"
    factory-method="getQueueConnectionFactory" id="connectionFactoryOracleAQAQQueue">
    <constructor-arg index="0">            
        <value>jdbc:oracle:thin:xx/xx@localhost:1521/orclpdb</value>            
    </constructor-arg>
    <constructor-arg index="1" type="java.util.Properties">
        <value/>
    </constructor-arg>
</bean>

我接下来要做的是使用 Jboss EAP 上的 JNDI 数据源而不是连接字符串。 所以我在jboss上配置了数据源

<datasource jta="true" jndi-name="java:/AQ_DB" pool-name="AQ_DB_DataSource" enabled="true" use-java-context="true">
    <connection-url>jdbc:oracle:thin:@localhost:1521/orclpdb</connection-url>
    <driver>oracle</driver>
    <security>
        <user-name>xx</user-name>
        <password>xx</password>
    </security>
</datasource>

<driver name="oracle" module="com.oracle">
    <driver-class>oracle.jdbc.driver.OracleDriver</driver-class>
    <xa-datasource-class>oracle.jdbc.xa.client.OracleXADataSource</xa-datasource-class>                     
</driver>

然后我将代码更改为使用如下连接:

<jee:jndi-lookup id="jndiConnectionFactory" jndi-name="java:/AQ_DB" />
        
    <bean class="oracle.jms.AQjmsFactory"
        factory-method="getQueueConnectionFactory" id="connectionFactoryOracleAQAQQueue">
        <constructor-arg index="0">
            <ref bean="jndiConnectionFactory"/> 
        </constructor-arg>        
    </bean>

但是,在启动 Jboss EAP 时,会显示以下错误。

Cause: Error creating the db_connection; nested exception is java.lang.ClassCastException: org.jboss.jca.adapters.jdbc.jdk8.WrappedConnectionJDK8 cannot be cast to oracle.jdbc.internal.OracleConnection: oracle.jms.AQjmsException: Error creating the db_connection
        at oracle.jms.AQjmsDBConnMgr.getConnection(AQjmsDBConnMgr.java:625)
        at oracle.jms.AQjmsDBConnMgr.<init>(AQjmsDBConnMgr.java:399)
        at oracle.jms.AQjmsConnection.<init>(AQjmsConnection.java:259)
        at oracle.jms.AQjmsConnectionFactory.createConnection(AQjmsConnectionFactory.java:529)
        at org.springframework.jms.connection.UserCredentialsConnectionFactoryAdapter.doCreateConnection(UserCredentialsConnectionFactoryAdapter.java:181)
        at org.springframework.jms.connection.UserCredentialsConnectionFactoryAdapter.createConnection(UserCredentialsConnectionFactoryAdapter.java:152)
        at org.springframework.jms.support.JmsAccessor.createConnection(JmsAccessor.java:180)
        at org.springframework.jms.listener.AbstractJmsListeningContainer.createSharedConnection(AbstractJmsListeningContainer.java:411)
        at org.springframework.jms.listener.AbstractJmsListeningContainer.refreshSharedConnection(AbstractJmsListeningContainer.java:396)
        at org.springframework.jms.listener.DefaultMessageListenerContainer.refreshConnectionUntilSuccessful(DefaultMessageListenerContainer.java:927)
        at org.springframework.jms.listener.DefaultMessageListenerContainer.recoverAfterListenerSetupFailure(DefaultMessageListenerContainer.java:901)
        at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.run(DefaultMessageListenerContainer.java:1079)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
        at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.ClassCastException: org.jboss.jca.adapters.jdbc.jdk8.WrappedConnectionJDK8 cannot be cast to oracle.jdbc.internal.OracleConnection
        at oracle.jms.AQjmsGeneralDBConnection.getProviderKey(AQjmsGeneralDBConnection.java:99)
        at oracle.jms.AQjmsGeneralDBConnection.<init>(AQjmsGeneralDBConnection.java:68)
        at oracle.jms.AQjmsDBConnMgr.getConnection(AQjmsDBConnMgr.java:566)

有人可以帮忙吗?

【问题讨论】:

    标签: spring jboss apache-camel oracle-aq


    【解决方案1】:

    您需要解开连接,因为它来自 Ironjacamar 池。

    【讨论】:

    • 好的。但我不确定如何将展开的连接传回 ConnectionFactory。因为要在骆驼中使用它,我需要将 ConnectionFactory 设置回 org.apache.camel.component.jms.JmsComponent
    • 不执行代码我不知道。您必须在某处配置要使用的数据源
    【解决方案2】:

    谢谢你,ehsavoie。你为我指明了正确的方向。

    所以我必须扩展 oracle 类来提供解决方案:

    private class OracleAqGetUnderlyingConnectionFactory extends AQjmsConnectionFactory {
       private DataSource dataSource;
       
       public void setDataSource(DataSource dataSource) {
           this.dataSource = dataSource;
       }
       
       @Override
       public javax.jms.Connection createConnection() throws javax.jms.JMSException {
        WrappedConnectionJDK8 connection = null;
        OracleConnection underlyingOracleConnection = null;
    try {
    connection = (WrappedConnectionJDK8) dataSource.getConnection();
    underlyingOracleConnection = (OracleConnection) connection.getUnderlyingConnection();
    } catch (SQLException e) {
    e.printStackTrace();
    }
           return AQjmsQueueConnectionFactory.createQueueConnection(underlyingOracleConnection);
       }
    
    }
    

    【讨论】:

      猜你喜欢
      • 2019-07-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-28
      • 2018-05-11
      • 2017-10-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多