Oracle Advanced Queuing广播失败(ORA-24033):Python客户端无接收者报错
先确认队列配置是否合规
首先得确保你的队列是多消费者队列,且已正确注册订阅者。ORA-24033常出现于单消费者队列尝试无接收者广播的场景。可以用SQL查询验证:-- 检查队列类型和最大消费者数 SELECT queue_type, max_consumers FROM dba_queues WHERE queue_name = '你的队列名'; -- 确认订阅者已注册 SELECT subscriber_name FROM dba_queue_subscribers WHERE queue_name = '你的队列名';要求
queue_type为NORMAL_QUEUE、max_consumers大于1,且查询结果里有已注册的订阅者。调整recipients参数的传递方式
别直接传recipients=None,试试传空列表recipients=[]。部分Oracle驱动对None的参数解析逻辑和空列表不同,空列表才会触发“向所有订阅者广播”的逻辑,而None会被判定为未指定合法接收者,进而抛出ORA-24033。排查版本兼容性问题
你用的19.8 Thick Client和19.3企业版版本差了小版本,可能存在参数解析的兼容性问题。可以尝试把客户端版本降到19.3,或者升级服务端到19.8,同时确保所用的cx_Oracle是适配19c的最新稳定版。检查poc-oracle-aq项目的代码逻辑
该项目v0.1版本的publisher.py可能对enqone()的参数处理有特殊逻辑,比如没做None值的兼容处理。可以打开代码看看调用enqone()的部分,确认是否需要额外设置消息属性(比如delivery_mode)来触发广播,而非单纯依赖recipients参数。关于未文档化参数的疑问
目前来看更可能是用法问题而非未文档化参数。如果上述方法都无效,可以查看cx_Oracle源码里enqone()的实现逻辑,或者去Oracle官方MOS文档搜索ORA-24033在多消费者队列广播场景下的解决方案。
内容的提问来源于stack exchange,提问作者Christophe

