Questo articolo è stato tradotto automaticamente. Per visualizzare l'articolo in inglese, selezionare la casella di controllo Inglese. È possibile anche visualizzare il testo inglese in una finestra popup posizionando il puntatore del mouse sopra il testo.
Traduzione
Inglese

Metodo MessageQueue.ReceiveByCorrelationId (String, TimeSpan, MessageQueueTransaction)

 

Data di pubblicazione: ottobre 2016

Riceve il messaggio che corrisponde all'identificatore di correlazione specificato (da una coda transazionale) e attende che un messaggio con l'identificatore di correlazione specificato è disponibile nella coda o alla scadenza del timeout.

Spazio dei nomi:   System.Messaging
Assembly:  System.Messaging (in System.Messaging.dll)

public Message ReceiveByCorrelationId(
	string correlationId,
	TimeSpan timeout,
	MessageQueueTransaction transaction
)

Parametri

correlationId
Type: System.String

Il CorrelationId del messaggio da ricevere.

timeout
Type: System.TimeSpan

Oggetto TimeSpan che indica il tempo di attesa fino a quando un messaggio nuovo è disponibile per l'ispezione.

transaction
Type: System.Messaging.MessageQueueTransaction

Oggetto MessageQueueTransaction.

Valore restituito

Type: System.Messaging.Message

Il Message cui CorrelationId corrisponde il correlationId passato nel parametro.

Exception Condition
ArgumentNullException

Il valore del parametro correlationId è null.

-oppure-

Il valore del parametro transaction è null.

ArgumentException

Il valore specificato per il timeout parametro non valido, probabilmente timeout è minore di TimeSpan.Zero o maggiore di MessageQueue.InfiniteTimeout.

MessageQueueException

Il messaggio con l'oggetto specificato correlationId non esiste nella coda e non è arrivato prima della scadenza del timeout.

-oppure-

La coda è transazionale.

-oppure-

Si è verificato un errore quando si accede a un metodo di Accodamento messaggi.

Questo metodo esegue la ricerca nella coda transazionale a cui fa riferimento il MessageQueue per un messaggio il cui CorrelationId corrisponde al valore specificato correlationId parametro. Questo metodo restituisce immediatamente se il messaggio con l'identificatore di correlazione specificato mediante il correlationId parametro è presente nella coda, utilizzando il contesto di transazione interna definito dal transaction parametro. In caso contrario, il metodo attende il periodo di tempo per l'arrivo di un nuovo messaggio. Se non arriva un nuovo messaggio prima che il timeout scade, viene generata un'eccezione.

Il timeout parametro specifica il totale tempo di esecuzione per questo metodo. Piuttosto, specifica il tempo di attesa per un nuovo messaggio in arrivo nella coda. Ogni volta che arriva un nuovo messaggio, questo metodo esamina la CorrelationId del nuovo messaggio per verificare se corrisponde il correlationId parametro. In caso contrario, questo metodo avvia nuovamente il periodo di timeout e attende l'arrivo di un nuovo messaggio. Pertanto, se i nuovi messaggi continuano ad arrivare entro il periodo di timeout, è possibile che questo metodo venga eseguito all'infinito, finché non scade il periodo di timeout senza che arrivino nuovi messaggi o fino a quando non arriva un messaggio la cui proprietà CorrelationId corrisponde il correlationId parametro.

Poiché questo metodo viene chiamato su una coda transazionale, il messaggio ricevuto verrà restituito alla coda se la transazione viene interrotta. Il messaggio non verrà rimosso definitivamente dalla coda fino a quando non viene eseguito il commit della transazione.

Il CorrelationId proprietà viene utilizzata per collegare un messaggio inviato alla coda di messaggi di risposta, report o riconoscimento associati.

Altri due metodi consentono di ricevere messaggi da una coda. Il Receive metodo restituisce il primo messaggio della coda e ReceiveById(String) metodo viene utilizzato per recuperare un messaggio specificando il relativo identificatore univoco.

Per leggere un messaggio con un identificatore di correlazione specificato senza rimuoverlo dalla coda, utilizzare il PeekByCorrelationId(String) metodo. Il PeekByCorrelationId(String) metodo restituisce sempre il primo messaggio della coda, le chiamate successive al metodo restituiscono lo stesso messaggio a meno che un messaggio con priorità più alta arriva nella coda. Nessun contesto di transazione associata a un messaggio restituito da una chiamata a PeekByCorrelationId(String). Poiché PeekByCorrelationId(String) non rimuove alcun messaggio nella coda, non vi sarà nulla di cui eseguire il rollback se la transazione viene interrotta.

Nella tabella seguente indica se questo metodo è disponibile in diverse modalità gruppo di lavoro.

Modalità gruppo di lavoro

Disponibile

Computer locale

Computer locale e il nome di formato direct

Computer remoto

No

Computer remoto e il nome di formato direct

L'esempio di codice seguente illustra l'uso di ReceiveByCorrelationId(String, TimeSpan, MessageQueueTransaction).


// Connect to a nontransactional queue on the local computer.
MessageQueue queue = new MessageQueue(".\\exampleQueue");

// Create a new message.
Message msg = new Message("Example Message Body");

// Send the message to the nontransactional queue.
queue.Send(msg, "Example Message Label");

// Get the message's Id property value.
string id = msg.Id;

// Receive the message from the nontransactional queue.
msg = queue.ReceiveById(id, TimeSpan.FromSeconds(10.0));

// Connect to a transactional queue on the local computer.
MessageQueue transQueue = new MessageQueue(".\\exampleTransQueue");

// Create a new message in response to the original message.
Message responseMsg = new Message("Example Response Message Body");

// Set the response message's CorrelationId property value to the Id
// property value of the original message.
responseMsg.CorrelationId = id;

// Send the response message to the transactional queue.
transQueue.Send(responseMsg, "Example Response Message Label",
    MessageQueueTransactionType.Single);

// Set the transactional queue's MessageReadPropertyFilter property to
// ensure that the response message includes the desired properties.
transQueue.MessageReadPropertyFilter.CorrelationId = true;

// Create a message queuing transaction.
MessageQueueTransaction transaction = new MessageQueueTransaction();

try
{
    // Begin a transaction.
    transaction.Begin();

    // Receive the response message from the transactional queue.
    responseMsg = transQueue.ReceiveByCorrelationId(id,
        TimeSpan.FromSeconds(10.0), transaction);

    // Commit the transaction.
    transaction.Commit();
}
catch(System.Exception e)
{
    // Cancel the transaction.
    transaction.Abort();

    // Propagate the exception.
    throw e;
}
finally
{
    // Dispose of the transaction object.
    transaction.Dispose();
}

// Display the response message's property values.
Console.WriteLine("Message.Label: {0}", responseMsg.Label);
Console.WriteLine("Message.CorrelationId: {0}",
    responseMsg.CorrelationId);

.NET Framework
Disponibile da 1.1
Torna all'inizio
Mostra: