ConnectionFactory для OracleAQ JMS с источником данных Karaf на маршруте Camel - PullRequest
0 голосов
/ 01 декабря 2018

Мне нужна помощь, чтобы работать в ConnectionFactory для OracleAQ JMS с источником данных Karaf на маршруте Camel.

Я создал источник данных в 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?

...