Мне нужна помощь, чтобы работать в 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?