问题描述
亲爱的专家,
需要您的指导/建议来解决此问题:
作为oracle advance queueing实现的一部分,我们必须在消息入队后立即将其出队。这应该立即发生,而无需任何人工干预/安排作业。在研究了一些论坛和metalink之后,我们发现DBMS_AQ.LISTEN将有助于完成这项工作。
从金属链接得到了例子-Example demonstrating using DBMS_AQ.LISTEN to listen to a Multi-Consumer Queue (Doc ID 564037.1)
以下是我们按照上面的示例遵循的步骤:
1) 创建一个队列表,排队并启动队列。
2) 订阅代理 (这里有多个代理,对于我的情况,一个还是多个都没关系)
3) 创建执行入队的过程
4) 创建执行出队的过程
5) 创建了侦听队列的过程 (在这方面,它通过在步骤4中调用过程来侦听队列并将消息出队)
完成上述配置后,请按照以下步骤执行:
a) 在会话1中,运行/启动listen_m过程以侦听多消费者队列。
b) 在会话2中,使用enq_msg过程对消息进行排队。
c) 在会话1中重新检查listen_m的输出。-> 已成功出队。
d) 在会话2中,使用enq_msg过程将另一条消息入队。
e) 在会话1中重新检查listen_m的输出。-> 这没有出队。
不知道为什么第二条消息没有出队,我的侦听器是否停止运行?或者侦听器只会监视队列,直到第一个消息被排队,之后它停止监视?
如果LISTNER不是实现我的要求的正确效用?如果是的话,还有什么其他替代方案可以在消息被排队到队列后立即监视和出队 (不管它是单个或多个消费者)
你可以在我的LIVESQL会话中找到脚本,它没有编译成功,因为下面的错误:
PLS-00201: 必须声明标识符 “DBMS_AQADM”
需要您的指导/建议来解决此问题:
作为oracle advance queueing实现的一部分,我们必须在消息入队后立即将其出队。这应该立即发生,而无需任何人工干预/安排作业。在研究了一些论坛和metalink之后,我们发现DBMS_AQ.LISTEN将有助于完成这项工作。
从金属链接得到了例子-Example demonstrating using DBMS_AQ.LISTEN to listen to a Multi-Consumer Queue (Doc ID 564037.1)
以下是我们按照上面的示例遵循的步骤:
1) 创建一个队列表,排队并启动队列。
2) 订阅代理 (这里有多个代理,对于我的情况,一个还是多个都没关系)
3) 创建执行入队的过程
4) 创建执行出队的过程
5) 创建了侦听队列的过程 (在这方面,它通过在步骤4中调用过程来侦听队列并将消息出队)
完成上述配置后,请按照以下步骤执行:
a) 在会话1中,运行/启动listen_m过程以侦听多消费者队列。
b) 在会话2中,使用enq_msg过程对消息进行排队。
c) 在会话1中重新检查listen_m的输出。-> 已成功出队。
d) 在会话2中,使用enq_msg过程将另一条消息入队。
e) 在会话1中重新检查listen_m的输出。-> 这没有出队。
不知道为什么第二条消息没有出队,我的侦听器是否停止运行?或者侦听器只会监视队列,直到第一个消息被排队,之后它停止监视?
如果LISTNER不是实现我的要求的正确效用?如果是的话,还有什么其他替代方案可以在消息被排队到队列后立即监视和出队 (不管它是单个或多个消费者)
你可以在我的LIVESQL会话中找到脚本,它没有编译成功,因为下面的错误:
PLS-00201: 必须声明标识符 “DBMS_AQADM”
专家解答
你会很高兴知道这个有一个简单的解决办法。
使用模型是,LISTEN正是这样做的-“等到我 * 听到 * 某事并停止”
所以你需要做的就是像守护进程一样运行它
通常你也会有某种方式发出信号,例如
使用模型是,LISTEN正是这样做的-“等到我 * 听到 * 某事并停止”
所以你需要做的就是像守护进程一样运行它
loop listen_m; end loop;
通常你也会有某种方式发出信号,例如
loop
listen_m;
if agent_w_msg.name = 'STOP' then
exit;
end if;
end loop;
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




