Oracle® Objects for OLE Developer's Guide 10g Release 1 (10.1) Part Number B10118-01 |
|
The OraAQ Monitor methods (MonitorStart and MonitorStop) provide asynchronous dequeuing through notifications. This is suitable for applications that prefer to process messages in non-blocking mode. Applications can request to be notified on arrival of messages, by supplying an Automation object to the Monitor method. This object implements a method called NotifyMe to receive notifications. Messages can be monitored based on consumer name, message Id, or correlation.
The following sample code demonstrates a simple usage of this facility. It illustrates a computerized trading system that executes buy/sell limit orders.
The sample instantiates a queue object for the queue STOCKS_TO_TRADE and monitors messages intended for consumer BROKER_AGENT. STOCKS_TO_TRADE queues messages of the user-defined type TRADEORDER_TYPE. This encapsulates all the information required to kick off a trade order. When messages addressed to BROKER_AGENT are dequeued, the NotifyMe method of the CallbackClient object is invoked and a stock trade is performed.
'First instantiate the CallbackClient. The queue monitor
' will invoke the NotifyMe on this class module.
Public CB_Client As New CallbackClient
Dim DB As OraDatabase
Dim Q as OraAQ
set Q = DB.CreateAQ("STOCKS_TO_TRADE")
'Notify by calling cbclient::NotifyMe when there are messages
' for consumer '"BROKER_AGENT"
Q.consumer = "BROKER_AGENT"
'Note that cbclient is a dispatch interface that
' supports the NotifyMe method.
Dim s as string
s = "BROKER_AGENT"
'Notify the client only when there are messages for "BROKER_AGENT"
Q.MonitorStart CB_Client, Q, s, 1
'other processing is performed here...
Q.MonitorStop
Return
'Now implement the NotifyMe method of the CallbackClient class module
'and the necessary arguments that will contain the dequeued message
'NotifyMe is the callback interface defined by user. Ctx here is the
'Q object passed in at the time of MontiorStart.
Public sub NotifyMe (ByVal Ctx As Variant, ByVal Msgid As Variant )
On Error GoTo NotifyMeErr
Dim tradingSignal as OraAQMsg
'Tradeorder contains details of the customer order
Dim tradeorder as OraObject
If IsNull(Msgid) Then
MsgBox "No Message"
'Get Error
MsgBox OraDatabase.LastServerErrText
Else
mvarMsgid = Msgid
Set tradingSignal = Ctx.AQMsg(1,"STOCK_TYPE","TRADER")
set tradeorder = tradingSignal.Value
'Tradeorder is the object of UDT "STOCK_TYPE"
'Access signal attribute of tradeorder as
'tradeorder("signal).Value or tradeorder!signal
if (tradeorder!signal = "SELL")
'Sell the stock
SellStock(tradeorder!NoOfShares,
tradeorder!Ticker,tradeorder!Price,
tradeorder!ValidUntil)
else if (tradeorder!signal = "BUY")
'Buy the stock
BuyStock(tradeorder!NoOfShares,
tradeorder!Ticker,tradeorder!Price,
tradeorder!ValidUntil)
end if
End If
NotifyMeErr:
Call RaiseError(MyUnhandledError, "newcallback:NotifyMe Method")
End Sub