Introduzione a MSMQS con ASP

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

withEvents
. Questo ha un senso, dal momento che la vita di una variabile in una pagina ASP è relativamente corta. L'applicazione che riceve i messaggi e opera su di essi beneficia ampiamente, però, di questo modello asincrono.

Accedere 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

MSMQQueue
e
MSMQEvent
(esiste una classe MSMQMEssage utilizzata per mantenere informazioni per un messaggio. Essa è fornita dalla funzione PeekCurrent, che osserveremo in seguito).

Option 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 Sub

Questo codice comincia con l'event Form_Load e crea una coda, a meno che non ne esista già una. In seguito, l'oggetto

m_objMSMQEvent
viene instanziato e associato tramite l'invocazione del metodo
EnableNotification
sull'oggetto MSMQQueue. Associato l'oggetto MSQMEvent, non rimane che creare le callback associate agli eventi Arrived e Arrived_Error (opzionale). L'evento Arrived scatta ogni volta che un nuovo messaggio è inviato alla coda, purchè il metodo EnableNotification sia stato chiamato dopo la lettura di un messaggio.

Questo 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 Sub

Il 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

MSMQMessage
è progettato per contenere tutti i tipi di informazione. Infatti il corpo (body) del messaggio può contenere stringhe (array di byte) e tipi numerici qualsiasi. Il corpo del messaggio è anche progettato per mantenere lo stato di un qualsiasi oggetto COM che supporti le interfacce IPersist e IDispatch . L'etichetta (Label) di un messaggio è una stringa che semplicemente descrive tale messaggio, in analogia al titolo di un messaggio di email.

Ci 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 Sub

Questo 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

Commenti
Dai un voto a questo articolo, ci aiuterà a migliorare il nostro sito (1 è il voto minimo, 5 il massimo).

Per procedere al rating dell'articolo devi essere autenticato.

Aggiungi un nuovo commento »»»
Per inserire un commento, devi registrarti alla nostra community.


TUTORIALS
TOP TEN ARTICOLI
NOTIFICHE

Iscriviti alla nostra newsletter nuoviarticoli per ricevere e-mail le notifiche!

Indirizzo e-mail:
PROVIDER ASP.NET 2.0

Seleziona il database per avere il web.config pronto per Membership, Roles e Profile API.



IN EVIDENZA
MISC