我测试设置一个可以使用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帐户作为我的数据源。
答案 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>