从Oracle Advanced Queues获取优先级消息

时间:2015-08-17 14:30:20

标签: oracle vb6

目前我有一段代码使用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

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

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

我很欣赏这是使用传统开发,但它是更大应用的基础。

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

谢谢

2 个答案:

答案 0 :(得分:2)

创建队列表时,可以设置参数" 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排序。 Dduring deque你将得到最优先的消息。

答案 1 :(得分:1)

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

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

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