骆驼路线中具有Karaf数据源的OracleAQ JMS的ConnectionFactory

时间:2018-12-01 13:05:56

标签: apache-camel apache-karaf oracle-aq

我需要帮助,才能使用骆驼路线中的Karaf数据源使用OracleAQ JMS连接工厂。

我已经在Karaf中使用蓝图xml文件创建了一个数据源(适用于sql):

<?xml version="1.0" encoding="UTF-8"?>
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0" 
    xmlns:ext="http://aries.apache.org/blueprint/xmlns/blueprint-ext/v1.0.0" 
    xmlns:enc="http://karaf.apache.org/xmlns/jasypt/v1.0.0">

    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
        <property name="driverClassName" value="oracle.jdbc.pool.OracleDataSource" />
        <property name="url" value="jdbc:oracle:thin:@//192.168.99.100:1521/xe" />
        <property name="username" value="system" />
        <property name="password" value="oracle" />
    </bean>
    <service interface="javax.sql.DataSource" ref="dataSource">
        <service-properties>
            <entry key="osgi.jndi.service.name" value="jdbc/fd-ds" />
        </service-properties>
    </service>
</blueprint>

要使用JMS,需要一个ConnectionFactory,我首先为此在路由中手动创建了数据源:

javax.jms.ConnectionFactory jmsConnectionFactory;
oracle.jdbc.pool.OracleDataSource dataSource = new oracle.jdbc.pool.OracleDataSource();
dataSource.setURL("jdbc:oracle:thin:@//192.168.99.100:1521/xe");
dataSource.setUser("system");
dataSource.setPassword("oracle");
jmsConnectionFactory = oracle.jms.AQjmsFactory.getQueueConnectionFactory(dataSource);

这可行,但这不是我想要的,因为所有路由都应通过同一数据源访问数据库。因此,我尝试使用容器中的数据源创建一个ConnectionFactory:

javax.sql.DataSource dataSource = (javax.sql.DataSource) ((new javax.naming.InitialContext()).lookup("osgi:service/jdbc/fd-ds"));
jmsConnectionFactory = oracle.jms.AQjmsFactory.getQueueConnectionFactory(dataSource);

这会导致此异常:

org.springframework.jms.UncategorizedJmsException: Uncategorized exception occurred during JMS processing; nested exception is oracle.jms.AQjmsException: Error creating the db_connection; nested exception is java.lang.ClassCastException: org.apache.commons.dbcp.PoolingDataSource$PoolGuardConnectionWrapper cannot be cast to oracle.jdbc.internal.OracleConnection

在我看来,这就像包装的数据源,所以我尝试了这一点:

oracle.jdbc.pool.OracleDataSource oracleDataSource = dataSource.unwrap(oracle.jdbc.pool.OracleDataSource.class);
jmsConnectionFactory = oracle.jms.AQjmsFactory.getQueueConnectionFactory(oracleDataSource);

这会导致此异常:

java.sql.SQLException: BasicDataSource is not a wrapper.

我已经考虑了数据源参数accessToUnderlyingConnectionAllowed,但这似乎仅对连接有用,而对数据源无效。

如何使用Karaf数据源创建ConnectionFactory?

0 个答案:

没有答案