我需要帮助,才能使用骆驼路线中的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?