问题标签 [advanced-queuing]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
573 浏览

oracle - 无法从 Oracle Advanced 异常队列中删除消息

例如,我有一个带有 3 条消息的异常高级队列。如果我尝试将它们出队,它工作正常,但在我的应用程序中,我需要通过 MSGID 删除其中一些。我使用 SQL 命令进行了尝试,但它延迟了很多,然后我就超时了。

高级队列:

尝试通过 MSGID 删除:

0 投票
1 回答
1016 浏览

oracle - ORA-25226 试图从异常队列中出列

当我尝试从异常队列中取出消息时,出现以下错误:

队列已创建,我在队列表上有异常队列,但我无法得到它。有什么想法吗?

0 投票
1 回答
233 浏览

oracle - Oracle 高级队列

我需要创建 xml 有效负载并将其发送到 oracle 高级队列。我知道使用 pl/sql 创建 xmlpayload。但不知道oracle AQ的。有人可以帮助我如何实现这一目标。如何创建 AQ 并将有效负载发送到 AQ?提前致谢。

0 投票
1 回答
1116 浏览

go - 收听高级 Oracle 队列 (AQ)

我正在检查 Go 迁移现有 C++ 应用程序的能力。主要任务之一是主动侦听(不轮询)高级 Oracle 队列。在 Java 和 C++ 中,已有很长时间以来支持它的库。

我在 Go(库和示例)中找不到类似的东西。你能帮我解决这个问题吗?

0 投票
1 回答
1061 浏览

oracle - dbms_aq.dequeue 是否应该永远循环?

这是我使用 Oracle 高级队列的第一步...

Szenario:我有一个正在运行的应用程序,其中有很多很多独立的进程向中央控制器报告以处理后续步骤。简化的进程是通过 cron 或刚刚完成的进程的回调启动的。回调来自远程主机通过 http -> php -> DB,基本上是远程主机上进程完成后的一个 http 调用。

完整的控制器逻辑是用 pl/sql 编写的,并考虑了单例概念,因此只有一个进程应该同时执行控制器逻辑。事实上,在 99% 的调用中,这不是必需的,但这不是我目前可以改变的事情(也不是一般的架构)。

为了确保这一点,实际上存在一个错误的互斥锁实现,伪代码

其中互斥锁是一个字段表,其值为 0 (=> "free") 或 1 ( => "busy" )

这种“美丽”构造的结果是充满“嘿!没有互斥锁!等待......”的日志文件。而且等待的进程越多,它们等待的时间越长,无法控制下一个是谁。有时负载变得如此沉重以至于apache首先分叉并最终死掉......

解决方案

所以我的第一个“操作”是用 Oracle Advanced Queuing 替换互斥锁,控制器作为单一消费者。好处:apache层内不再“忙着等待”,严格先到先得。

(因为所有 DB-Action 都发生在同一个 oracle-schema 中,这可以通过标准对象、pl/sql-methods 来实现。但是,如果有 dbms-packages,为什么要重新发明轮子呢?)

据我所知,在这种情况下使用监听功能(轮询排队的项目)比注册功能(在消息到达时安排动作)要好得多。

基本上一切正常,我设法:

  • 创建消息类型
  • 创建队列表
  • 创建队列
  • 开始排队
  • 将 USER 添加为订阅者
  • 创建入队过程
  • 创建处理和出队的过程
  • 创建一个用于侦听队列并在消息到达时调用“process & dequeue”函数的过程。

当然,监听器应该 24/7 都处于活动状态,所以我没有指定“等待”时间。一般来说,根据一天中的时间,他至少每隔几分钟就会有“要做的事情”,更有可能每隔几秒钟,有时甚至更多。

现在这是我的问题(如果它确实是一个问题),我只是根据我目前找到的示例编写它:

调用该过程基本上符合我的预期:它保持“启动”并处理排队的消息。

但这是做到这一点的方法吗?如果没有排队的消息,它会做什么?dbms_aq.listen -routine中的“睡眠”或“尽可能快地循环”,这样我就实现了另一种“忙于等待”的方式?可能有一个超时(可能在 oss 级别或其他地方)我只是没有达到?

这是队列定义等的完整代码:demo_dbms_aq_with_listener.sql

更新

通过进一步的测试,我才意识到,我似乎比我希望的更缺乏理解:(

在“执行级别”根本不使用侦听器,只是循环出队函数具有相同的效果:它等待第一条/下一条消息

p>

至少这更容易测试,只调用

p>

也只是等待第一条消息。这让我完全困惑我是否需要听众,如果我正在做的事情确实有任何意义:(

结论

我根本不需要监听器,因为我有一个消费者可以以同样的方式处理所有消息。

但是关键/核心问题保持不变:是否可以将 DBMS_AQ.DEQUEUE 保持在“可能处于活动状态”的循环中,知道它会在很短的时间间隔内整天收到消息

(你会在上面链接的 sql 文件中找到 DEMO_AQ_DEQUEUE())

0 投票
1 回答
145 浏览

oracle - 数据库重新启动时的 Oracle 高级队列行为

如果数据库崩溃并重新启动,Oracle Queue 会发生什么?我们是否必须再次手动重新启动队列?是否会出现不一致的事务,或者 oracle 数据库服务器是否足够智能来处理这种情况?

如果在数据库重新启动后需要手动重新启动队列,那么创建一个自动启动队列的作业是否理想?

0 投票
1 回答
3202 浏览

oracle - 消息驱动的 EJB 无法连接 JMS 目标,说明创建 db_connection 时出错

我们有 Oracle OSB 11g,它连接到远程位置或不同 LAN 中的 Oracle 12C DB。

WebLogic EJB 通过 JMS/JDBC 连接到 Oracle AQ,目前我们遇到了问题。

WLS 日志说:

我在互联网上搜索并找到了我必须添加以下参数并添加到 setDomainEnv.sh 并重新启动 WebLogic 管理员和托管服务器的解决方案,但这个问题仍然没有解决。我还检查了用于连接数据库的数据库用户是否具有对 Oracle 队列的入队/出队权限。

参数是

0 投票
0 回答
99 浏览

oracle - 如何使Oracle不是由SYS而是由过程的所有者执行回调过程

我是 Oracle 高级队列的新手。我有一个排队的过程,以及一个订阅和注册该队列中项目的回调过程。所有这些对象都是在用户模式中创建的。但是当项目出现在队列中时,回调过程会触发,但不是由模式的用户触发,而是由用户 SYS 触发。应该进行哪些设置以使 Oracle 执行回调过程不是由用户 SYS 而是由用户 - 创建回调过程的模式的所有者

我使用了这里的示例http://innerlife.io/ru/oracle-db-advanced-queuing-subscriber-2/

来自 t_log 表的查询返回“SYS”。因此,回调过程由用户 SYS 触发。但我希望看到用户——创建这些对象的模式的所有者。它不是 SYS。如何做到这一点?

0 投票
1 回答
395 浏览

oracle - 在 Oracle 中,我们如何在 dbms_aq.dequeue 中有条件地使数据出队

Oracle 数据库是 11g。我的问题与 Oracle APPS ERP 有关。

我们正在使用 dbms_aq.dequeue 将销售订单出列。问题是,所有的销售订单行都出队了。我们想要设置一个条件,即 dbms_aq.dequeue 应该只将 ORG_ID 为 82 的销售订单行出列。

这是 Oracle 中的标准包 ASO_ORDER_FEEDBACK_GET_PVT。

宣言

代码

现在,SYSTEM.ASO_Order_Feedback_Type 由许多其他类型组成,即 header_type ASO_Header_Type、line_varray ASO_Line_Var_Type 等。

假设,如果我想设置一个条件来有条件地从 header_type 检索行,我可以在调用 dbms_aq.dequeue 之前设置以下条件

但我不知道如何设置条件以从 line_varray 有条件地检索行,因为

  1. line_varray 是 ASO_Line_Var_Type
  2. 类型 ASO_Line_Var_Type 定义为 VARRAY (1000000000) OF ASO_Line_Type
  3. 并且 ASO_Line_Type 被定义为 OBJECT (accounting_rule_id NUMBER , actual_arrival_date DATE , .... , org_id NUMBER , ....)

我可以这样写条件吗

0 投票
1 回答
145 浏览

java - 将 weblogic JMS 移动到 Oracle 高级队列时出错

我正在尝试使用 Oracle Advanced Queuing 而不是 weblogic 中正在运行的 JMS 实现。

从理论上讲,我在 Weblogic 中已按应有的方式配置了所有内容(根据文档),但是在尝试发送消息时出现以下错误:

我的代码运行的最后一个地方就是:

我已经检查了这个 JMS 2.0 文档,似乎一切都应该正常工作。我可以从不同版本或类似的东西导入接口吗?