Introduzione a MSMQS con ASP

3 pagine in totale: <<Indietro 1 2 [3]

L'invio di un messaggio è la funzionalità più comune che MSMQ utilizza nelle pagine ASP. Per mandare un messaggio occorre aprire una coda con accesso di tipo send (

MQ_SEND_ACCESS
) e preparare un messaggio prima di invocare la funzione send sulla classe MSQMMessage.

<%
 
  'dim some variables 
  Dim objQInfo
  Dim objQSend
  Dim objMessage
 
  'open the queue
  Set objQInfo = Server.CreateObject("MSMQ.MSMQQueueInfo")
  objQInfo.PathName = ".\test"
  Set objQSend = objQInfo.Open(MQ_SEND_ACCESS, MQ_DENY_NONE)
 
  'build/send the message = costruisci il messaggio
  Set objMessage = Server.CreateObject("MSMQ.MSMQMessage")
  objMessage.Label = "This is the label." 'etichetta
  objMessage.Body = "This is the body." 'corpo
  objMessage.Send objQSend
  objQSend.Close
  'clean up
  Set objQInfo = Nothing
  Set objQSend = Nothing
  Set objMessage = Nothing
%>

Questo codice apre una coda abilitata all'invio dei messaggi. Il messaggio viene creato come istanza della classe per i messaggi, aggiungendo Label e Body. Il messaggio è inviato tramite la funzione Send (la cosa è passata come parametro).

Possibili utilizzi di MSMQ

Gli usi di MSQM in un'applicazione sono parecchi, ma quello più comune è quello di scaricare le parti più pesanti per la CPU su di un altro thread (caso MSQM sulla stessa macchina come IIS) o su di un altro computer (MSQM ed IIS su computer diversi). Spostando l'esecuzione ad un altro thread o computer, la pagina ASP può continuare a girare asincronicamente.

Due cose determinano normalmente se valga la pena o meno spostare l'esecuzione di una certa operazione: minimizzare il tempo di esecuzione e minimizzare i tempi necessari per dare all'utente una conferma visiva. L'esecuzione può essere spostata su di un altro computer qualora l'utente non si aspetti una conferma immediata. Un esempio potrebbe essere la ricalcolazione dei dati sull'inventario a seguito del piazzamento di un ordine.

Se l'operazione in corso sul server durante la generazione della pagina web impiega troppo tempo, si rischia che la pagina vada in time-out in faccia all'utente. In tal caso l'utente riceverebbe un messaggio di errore oppure farebbe un tentativo di refresh prima che l'operazione sia conclusa. Questo spostamento dell'esecuzione, noto anche come esecuzione in background, non solo velocizza il tempo richiesto a generare la pagina, ma in definitiva migliora di gran lunga la scalabilità del server web

MSQM ha anche la capacità di tenere certi oggetti COM nel corpo del messaggio. L'unico requisito è che l'oggetto in questione supporti le interfacce

IDispatch
e
IPersist
(
IPersistStream
o
IPersistStorage
). Questo meccanismo è facilissimo da usare e fa risparmiare molto tempo in termini di sviluppo. Due classi che supportano queste interfacce sono
ADODB.Recordset
(e
ADOR.Recordset
) e
Word.Document
. Quest'ultimo stralcio di codice invia un recordset come corpo di un messaggio MSQMMessage.

Public Sub SendRecordsetInMessage()
 
  Dim objQInfo As New MSMQ.MSMQQueueInfo
  Dim objQSend As MSMQ.MSMQQueue
  Dim objMessage As New MSMQ.MSMQMessage
  Dim objRS As New ADOR.Recordset
 
  Dim a As New MSMQQueue
 
  'build/fill the recordset / cistruisci il recordset
  With objRS
  'build the recordset structure
  .CursorLocation = adUseClient
  .Fields.Append "FN", adVarChar, 25
  .Fields.Append "LN", adVarChar, 25
  .Open
 
  'add a record
  .AddNew
  .Fields("FN") = "Chris"
  .Fields("LN") = "Blexrud"
  .Update
 
  'add a record
  .AddNew
  .Fields("FN") = "Shayna"
  .Fields("LN") = "Blexrud"
  .Update
  End With
 
  'build/get the queue
  objQInfo.PathName = ".\test"
  Set objQSend = objQInfo.Open(MQ_SEND_ACCESS, MQ_DENY_NONE)
 
  'build/send the message
  objMessage.Label = "Recordset State!!!!"
  objMessage.Body = objRS
  objMessage.Send objQSend
  objQSend.Close
  'clean up
  Set objQInfo = Nothing
  Set objQSend = Nothing
  Set objMessage = Nothing
  Set objRS = Nothing
End Sub

Quando il recordset viene ricostruito dal messaggio, ciò avviene assegnado ad esso il corpo del messaggio, dal momento che il messaggio è di tipo Variant

Set objRS = objMessage.Body

Considerazioni

C'è una difficoltà nello sviluppare applicazioni con MSMQ - la mancanza di feedback riguardo al risultato di eventuali operazioni. Benchè ciò abbia perfettamente senso nell'architettura di MSMQ, sarebbe opportuno avere a disposizione delle funzioni per scoprire il risultato dell'esecuzione assegnata ad un altro processo attraverso un messaggio MSQM.

Ci sono dei metodi per aggirare il problema. Potreste, ad esempio, inviare un messaggio all'utente affinchè egli possa, se lo desidera, controllare la coda e verificare che il task sia stato portato a termine correttamente.

In alternativa, potete utilizzare una tabella nel database per seguire l'andamento dei task assegnati attraverso MSMQ e definire una serie di standard che ogni utente MSMQ deve soddisfare. In seguito gli utenti possono guardare la tabella per capire se il loro task è stato eseguito e con quale esito.

Un ultima nota - l'installazione di MSQM richiede molte cose. L'installazione del server presuppone la presenza di MS SQL server (6.5 o 7), al fine di poter seguire le varie informazioni necessarie al supporto della coda. Anche l'installazione del client, benchè non richieda un database, richiede comunque grandi risorse.

Link associati

3 pagine in totale: <<Indietro 1 2 [3]

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