【问题标题】:Getting priority messages from Oracle Advanced Queues从 Oracle Advanced Queues 获取优先级消息
【发布时间】:2015-08-17 14:30:20
【问题描述】:

目前我有一段代码使用 oracle 高级队列将消息入队和出队。

我需要做的是首先检查具有高优先级的消息,然后再获取其他消息。但我似乎无法做到这一点。

这是我的代码示例:

Public Function GetQMsg(ByRef sMsg, ByRef vMsgId As Variant, Optional lWait As Long = ORAAQ_DQ_NOWAIT) As Long

gobjDB.LastServerErrReset
sMsg = ""

On Error GoTo cmdErr
gobjQ.Wait = lWait     ' ORAAQ_DQ_NOWAIT
gobjQ.Navigation = ORAAQ_DQ_FIRST_MSG ' to refresh snapshot of msgs waiting
'gobjQ.DequeueMode = ORAAQ_DQ_BROWSE
vMsgId = gobjQ.Dequeue()

sMsg = gobjMsg.Value

GetQMsg = 0
GoTo Fin

cmdErr:
If gobjDB.LastServerErr = 25228 Then
    ' no msg available:
    GetQMsg = QUEUE_EMPTY
Else
    GetQMsg = gobjDB.LastServerErr
End If

Fin:
End Function

如果我在代码中添加以下行,我可以看到消息优先级,但我无法确定如何首先返回最高优先级的消息。

'Debug.Print "Message Priority: " & gobjMsg.Priority

我很欣赏这是使用遗留开发,但它是更大应用程序的基础。

所以我的问题是如何让消息按优先顺序返回?

谢谢

【问题讨论】:

    标签: oracle vb6


    【解决方案1】:

    当您创建队列表时,您可以设置参数“sort_list”。

     DBMS_AQADM.CREATE_QUEUE_TABLE (
    queue_table        => 'aq.priority_msg', 
    sort_list          => 'PRIORITY desc,ENQ_TIME', 
    queue_payload_type => 'aq.Message_typ');
    

    并且队列表将按优先级和enq_time排序。在双端队列期间,您将获得最高优先级的消息。

    【讨论】:

    • 感谢您的回复,这是否意味着表格将始终在顶部具有最高优先级的消息,所以我实现这一点的更改将仅在 oracle 中,而我的 VB6 应用程序将保持不变?跨度>
    【解决方案2】:

    当您在 Oracle 中创建队列时,会在拥有该队列的架构中创建许多视图。您应该可以使用以下方式查询队列的优先级:

    SELECT aq.msg_id
    FROM   aq$queue_table aq
    WHERE aq.priority = <your_priority);
    

    然后创建一个使用此查询的游标,您可以修改您的过程以浏览或出列所需的结果。

    【讨论】:

    • 感谢您的回复,我正在寻找一种以最少的代码更改来实现此功能的方法。
    猜你喜欢
    • 2010-11-21
    • 2015-02-11
    • 2012-05-31
    • 1970-01-01
    • 2014-02-08
    • 2012-09-04
    • 2015-12-23
    • 1970-01-01
    • 2023-04-01
    相关资源
    最近更新 更多