使用Oracle AQ队列配置Web逻辑JMS模块

时间:2012-02-20 14:52:54

标签: jndi weblogic11g oracle-aq

我测试设置一个可以使用Oracle AQ JMS实现的Web逻辑服务器,但由于某种原因我的WLS连接池看不到我创建的队列,我能看到在Web逻辑中查找队列的唯一方法是使Web逻辑数据源连接池使用创建队列的DB用户的凭据。

我已经完成了以下admin_user:

创建了一个队列表

EXECUTE DBMS_AQADM.CREATE_QUEUE_TABLE(queue_table=>'testqueue_table',queue_payload_type=>'sys.aq$_jms_text_message');

创建了一个队列

EXECUTE dbms_aqadm.create_queue(queue_name=>'testqueue', queue_table=>'testqueue_table');

启动了队列

EXECUTE dbms_aqadm.start_queue(queue_name=>'testqueue');

授予CPOOL用户权限

GRANT aq_user_role TO cpool;
EXECUTE DBMS_AQADM.grant_queue_privilege(privilege=>'ALL', queue_name=>'adming_user.testqueue', grantee=>'cpool',grant_option=>FALSE);

在Web Logic中设置2个JDBC数据源 我在Web逻辑中设置了两个连接到我的数据库的数据源,两者都是相同的,除了一个使用 cpool 用户而另一个使用 admin_user

创建JMS模块 现在我使用JDBC DataSources注册一个jms模块,并连接本地和外部JDNI名称。

如果我使用使用 admin_user 的DataSource,一切正常,我部署的应用程序可以在JNDI中找到队列。

问题 如果我使用使用 cpool 的数据源,那么它将失败在JNDI中找到连接池但从未找到Queue(尽管它对admin_user起作用)。我从WL得到以下错误:

Related cause:org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'testqueue': Invocation of init method failed; nested exception is javax.naming.NameNotFoundException: Cannot resolve name:Queues/TESTQUEUE

有没有人知道为什么WL无法解析队列的JNDI名称,除非我使用admin_user帐户作为我的数据源。

1 个答案:

答案 0 :(得分:1)

答案是我的连接池用户缺少一些授权,以下是必要的:

GRANT EXECUTE on DBMS_AQ to <CPOOL>;
GRANT EXECUTE on DBMS_AQADM to <CPOOL>;
GRANT aq_user_role to <CPOOL>;

确保创建目标的用户授予对连接池用户的访问权限:

`EXECUTE DBMS_AQADM.grant_queue_privilege(privilege=>'ALL', queue_name=>'<SCHEMAOWNER>.docprod_queue', grantee=>'<CPOOL>',grant_option=>FALSE);`

最后在Web Logic中,确保通过其完整的外部JNDI名称引用目标:

Queues/<SCHEMA OWNER>.<DESTINATION_NAME>