暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle DBMS_AQ.LISTEN监听单/多消费者队列

askTom 2018-01-13
242

问题描述

亲爱的专家,
需要您的指导/建议来解决此问题:
作为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正是这样做的-“等到我 * 听到 * 某事并停止”

所以你需要做的就是像守护进程一样运行它

loop
  listen_m;
end loop;


通常你也会有某种方式发出信号,例如

loop
  listen_m;
  if agent_w_msg.name = 'STOP' then 
     exit;
  end if;
end loop;


「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论