3 pagine in totale: <<Indietro 1 [2] 3 Avanti >>
MSMQQueue
La classe MSMQQueue rappresenta una coda aperta che è parte di un servizio MSMQ. Questa classe vi da la possibilità di scandire la coda dei messaggi secondo il paradima classico del cursore. Non è possibile aprire una coda usando la classe MSMQQueue. Per farlo occorre usare MSQMQueueInfo (come detto sopra).
Anche se la maggior parte delle applicazioni ASP che utilizzano MSMQ normalmente si limitano ad inviare messaggi, ci sono occasioni in cui delle pagine ASP devono aprire una coda per farne vedere i messaggi. Le pagine per amministrare un sistema ne sono un classico esempio.
La maggior parte delle applicazioni MSMQ necessitano anche di una parte sul server che risponda ai messaggi mano a mano che vengono ricevuti e che reagisca di conseguenza.
I messaggi possono essere reperiti dalla coda in modo sincrono o asincrono, benchè le pagine ASP possano solo estrarli sincronicamente. Ciò è dovuto al fatto che ASP non può dichiarare una variabile di lato server di nome
withEventsAccedere al messaggi MSMQ asincronicamente permette all'applicazione di aspettare il verificarsi di un determinato 'event' quando un messaggio appare nella coda.Questo implica che l'applicazione di lato server non consuma risorse mentre aspetta di ricevere un messaggio. MSQMEvent genera gli event a cui il lato server dell'applicazione può rispondere.
Il codice che segue mostra come aprire una coda locale e rispondere ai messaggi asincronicamente attraverso l'uso delle classi
MSMQQueueMSMQEventOption Explicit
Dim m_objQueueInfo As New MSMQQueueInfo
Dim m_objQueue As MSMQQueue
Dim WithEvents m_objMSMQEvent As MSMQEvent
Private Sub Form_Load()
'Create the queue, ignoring the error if it's already there
'crea una coda. Ignora l'errore se già si è verificato
m_objQueueInfo.PathName = ".\MyQueue"
m_objQueueInfo.Label = "My Sample Queue"
'If queue already exists iqnore it
'se una coda già esiste, ignorala
On Error Resume Next
m_objQueueInfo.Create
On Error GoTo 0
'open the queue ( apri la coda )
Set m_objQueue = m_objQueueInfo.Open(MQ_RECEIVE_ACCESS, _ MQ_DENY_NONE)
'link the events ( associa gli event )
Set m_objMSMQEvent = New MSMQEvent
m_objQueue.EnableNotification m_objMSMQEvent, MQMSG_CURRENT, 1000
End Sub
Private Sub m_objMSMQEvent_Arrived(ByVal Queue As Object, _
ByVal Cursor As Long)
'process the message ( gestisci il messaggio )
Dim m_objMessage As MSMQMessage
Set m_objMessage = Queue.PeekCurrent
MsgBox "Message Received: " & m_objMessage.Label
'link the event for the next message
' associa l'event per il prossimo messaggio
m_objQueue.EnableNotification m_objMSMQEvent, MQMSG_NEXT, 10000
End Sub
Private Sub m_objMSMQEvent_ArrivedError(ByVal Queue As Object, _
ByVal ErrorCode As Long, ByVal Cursor As Long)
'something went wrong!
MsgBox "Error accorded: " & ErrorCode
End SubQuesto codice comincia con l'event Form_Load e crea una coda, a meno che non ne esista già una. In seguito, l'oggetto
m_objMSMQEventEnableNotificationQuesto evento restituisce due puntatori, uno alla coda da cui si può leggere il messaggio e uno al Cursor. In caso di errore, la callback associata ad ArrivedError scatterà con un puntatore all'oggetto che rappresenta la coda, un numero che rappresenta l'errore ed un puntatore al cursore.
Nel caso in cui i messaggi vengano consumati in modo sincrono, l'esecuzione del codice è sospesa fino a che un messaggio non appare o non scatta il time-out. Il codice che segue apre una coda e guarda tutti i messaggi che essa contiene:
'DisplayMessages = mostra i messaggi
Public Sub DisplayMessages()
Dim objQueueInfo As New MSMQQueueInfo
Dim objQueue As MSMQQueue
Dim objMessage As MSMQMessage
'Create the queue, ignoring the error if it's already there
'Crea la coda. Ignora gli errori nel caso che già esista
objQueueInfo.PathName = ".\MyQueue"
objQueueInfo.Label = "My Sample Queue"
'If queue already exists iqnore it
On Error Resume Next
objQueueInfo.Create
On Error GoTo 0
'open the queue = apri la coda
Set objQueue = objQueueInfo.Open(MQ_RECEIVE_ACCESS, MQ_DENY_NONE)
'Loop through all the messages in the queue
'vai in ciclo su tutti i messaggi in coda
Do While True
Set objMessage = objQueue.Peek(, , 1000)
If objMessage Is Nothing Then Exit Do
MsgBox "Message: " & objMessage.Label
Loop
MsgBox "No more new messages." 'fine messaggi
'clean up
objQueue.Close
Set objMessage = Nothing
Set objQueue = Nothing
Set objQueueInfo = Nothing
End SubIl codice appena mostrato inizia identicamente a quanto visto per il modo asincrono, ma invece di usare la classe MSMQEvent, inizia un ciclo Do While fintanto che la funzione Peek della classe MSMQQueue non termina di restituire messaggi. Ciò avviene quando scatta il time-out, nel nostro caso si tratta di 1000 millisecondi.
MSMQMessage
La classe MSMQMessage contiene tutti gli attributi per un messaggio in una coda. I messaggi MSMQ hanno due metodi ed un bel pò di attributi. Mi limiterò ai due attributi principali - Body e Label - e al metodo principale - Send.
Un messaggio
MSMQMessageCi sono due modi di ricevere un messaggio: opening (apertura) e peeking (sbirciata). Un messaggio che viene aperto è immediatamente rimosso dalla coda, mentre lo stesso messaggio viene lasciato nella coda fino alla sua scadenza qualora ci si limiti a dargli una sbirciatina (peek, appunto). Le due funzioni open e Peek sono implementate dalla classe MSMQQueue. Entrambe restituiscono un puntatore al messaggio. Il codice che segue apre un messaggio e ne mostra sia il corpo che l'etichetta (body e label).
Private Sub LookForMessage() 'look for message = cerca il messaggio
Dim objQInfo As New MSMQQueueInfo
Dim objQReceive As MSMQQueue
Dim objMessage As MSMQMessage
'open the queue
objQInfo.PathName = ".\test" 'or ".\test"
Set objQReceive = objQInfo.Open(MQ_RECEIVE_ACCESS, MQ_DENY_NONE)
'look for a message (time-out set to 100 ms)
Set objMessage = objQReceive.Receive(, , , 100)
'was there a messsage? c'era un messaggio?
If Not objMessage Is Nothing Then
'display the contents of the message
'mostra il contenuto del messaggio
MsgBox objMessage.Label & " - " & objMessage.Body
Else
'no message
Msgbox "Nothing in the queue" 'in coda non c'era niente
End If
'clean up (pulizie)
objQReceive.Close
Set objQInfo = Nothing
Set objQReceive = Nothing
Set objMessage = Nothing
End SubQuesto codice inizia aprendo una coda e cercando uno dei messaggi che ci sta dentro. La funzione receive, con un timeout di 100 millisecondi, è invocata per cercare i messaggi.
Il time-out dice alla libreria MSMQ di fermare la ricerca di un messaggio. Un time-out molto basso implica che il codice si limiti a controllare l'esistenza di messaggi giacenti, piuttosto che aspettare nuovi messaggi non ancora giunti.Qualora l'utente intenda controllare l'arrivo di messaggi, basta che controllino se la funzione Receive ha restituito un messaggio valido oppure
Nothing (If Not objMessage Is Nothing)Nel caso in cui la funzione abbia in effetti restituito un messaggio, il codice mostra l'etichetta e il corpo del messaggio.
3 pagine in totale: <<Indietro 1 [2] 3 Avanti >>
Contenuti dell'articolo
Aggiungi un nuovo commento »»»
Per inserire un commento, devi registrarti alla nostra community.







Difficoltà
Stampa
Download 



