从 Oracle Advanced Queues 获取优先消息
Getting priority messages from Oracle Advanced Queues
目前我有一段代码使用 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
如果我将以下行添加到代码中,我可以看到消息优先级,但我不知道如何return 优先级最高的消息优先。
'Debug.Print "Message Priority: " & gobjMsg.Priority
我很欣赏这是使用遗留开发,但它是更大应用程序的基础。
所以我的问题是如何按优先顺序 return 获取消息?
谢谢
当您在 Oracle 中创建队列时,会在拥有该队列的架构中创建多个视图。您应该能够使用如下方式查询队列的优先级:
SELECT aq.msg_id
FROM aq$queue_table aq
WHERE aq.priority = <your_priority);
然后创建一个使用此查询的游标,您可以修改您的过程以浏览或出列所需的结果。
创建队列时table可以设置参数"sort_list"。
DBMS_AQADM.CREATE_QUEUE_TABLE (
queue_table => 'aq.priority_msg',
sort_list => 'PRIORITY desc,ENQ_TIME',
queue_payload_type => 'aq.Message_typ');
并且队列 table 将按优先级和 enq_time 排序。在双端队列中,您将获得优先级最高的消息。
目前我有一段代码使用 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
如果我将以下行添加到代码中,我可以看到消息优先级,但我不知道如何return 优先级最高的消息优先。
'Debug.Print "Message Priority: " & gobjMsg.Priority
我很欣赏这是使用遗留开发,但它是更大应用程序的基础。
所以我的问题是如何按优先顺序 return 获取消息?
谢谢
当您在 Oracle 中创建队列时,会在拥有该队列的架构中创建多个视图。您应该能够使用如下方式查询队列的优先级:
SELECT aq.msg_id
FROM aq$queue_table aq
WHERE aq.priority = <your_priority);
然后创建一个使用此查询的游标,您可以修改您的过程以浏览或出列所需的结果。
创建队列时table可以设置参数"sort_list"。
DBMS_AQADM.CREATE_QUEUE_TABLE (
queue_table => 'aq.priority_msg',
sort_list => 'PRIORITY desc,ENQ_TIME',
queue_payload_type => 'aq.Message_typ');
并且队列 table 将按优先级和 enq_time 排序。在双端队列中,您将获得优先级最高的消息。