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

Posted

技术标签:

【中文标题】使用 Oracle AQ 队列配置 Web Logic JMS 模块【英文标题】:Configuring Web Logic JMS Module with Oracle AQ Queues 【发布时间】:2012-02-20 14:52:53 【问题描述】:

我正在测试设置一个可以使用 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 逻辑中设置了 2 个连接到我的数据库的数据源,除了一个使用 cpool 用户和另一个使用 admin_user

之外,它们都是相同的

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

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

问题 如果我使用使用 cpool 的数据源,那么它将无法在 JNDI 中找到连接池,但永远不会找到队列(尽管它对 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】:

答案是我的连接池用户缺少一些授权,在需要的地方如下:

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>

【讨论】:

以上是关于使用 Oracle AQ 队列配置 Web Logic JMS 模块的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Oracle AQ 中清除队列

以编程方式检查Oracle AQ队列是否存在

Oracle AQ订阅注册错误?

从哪里获取 11.2.0.3 的 Oracle jar 文件 - xdb、aq、i18n、xmlparser

如何确定 DBMS_AQ.DEQUEUE_ARRAY 的负载类型

无法将大于 2000 字节的 LOB 作为缓冲消息排入 Oracle AQ