2009-04-08 8 views
5

È possibile garantire la consegna ordinata quando si utilizza WCF netMSMQbinding?Ordine di consegna con netMSMQbinding

Stiamo inserendo un comando di inserimento seguito da una serie di comandi di aggiornamento nella stessa coda, e occasionalmente uno degli aggiornamenti batte l'inserto.

Dopo aver aggiunto una registrazione estesa, è chiaro che vengono aggiunti alla coda nell'ordine corretto e vengono elaborati in un ordine diverso.

Sono riuscito a Google un paio di articoli che affermano che questo comportamento è previsto, ma sembra che sia possibile configurarlo in modo da essere ordinato in qualche modo.

nostre code sono transazionale, quindi non credo che l'aggiunta di numeri di sequenza e risequenziamento a destinazione è andare a lavorare, come che perderà transactionality

Se posso aggiungere l'attributo [DeliveryRequirements(RequireOrderedDelivery=true, QueuedDeliveryRequirements=QueuedDeliveryRequirementsMode.Require)] ottengo il seguente errore :

The DeliveryRequirementsAttribute on contract 'IService' specifies a QueuedDeliveryRequirements value of NotAllowed. However, the configured binding for this contract specifies that it does support queued delivery. A queued binding may not be used with this contract.

non ho idea del motivo per cui si ottiene questo errore, "appare" come tutto sia installato correttamente. Non sono riuscito a trovare alcuna conferma che questa impostazione sia consentita per MSMQ, poiché sembra essere un'impostazione WS-RM e AMSIK netMSMQBinding non supporta WS-RM.

+0

Ho presentato un bug di connessione su questo argomento, non è esattamente lo stesso problema come si doveva, ma abbastanza vicino ... Ho anche una soluzione nel bug di connessione. Controlla qui: https://connect.microsoft.com/VisualStudio/feedback/details/1107645/wcf-receives-messages-from-msmq-out-of-order –

risposta

3

MSMQ non supporta la consegna ordinata, quindi non è possibile.

Date un'occhiata a System.ServiceModel.Channels.MsmqBindingElementBase + BindingDeliveryCapabilitiesHelper che è la classe che specifica le capacità di legame di MSMQ, e come si implementa quella proprietà:

bool IBindingDeliveryCapabilities.AssuresOrderedDelivery 
{ 
    get 
    { 
     return false; 
    } 
} 
+0

Perfetto. Solo la risposta definitiva che stavo cercando. Ora posso tornare al lavoro del giorno :) – Modan

1

Sembra che è possibile raggruppare i messaggi, in modo quindi si potrebbe specificare l'ordine nel contratto. Dai un'occhiata a questo MSDN article on grouping messages.

2

This post from Simon Gittins sembra suggerisce che la consegna ordinato è possibile:

As it turns out, there's an undocumented feature that deals with this situation:

  • Apply a TransactedBatchingBehavior with a batch size of ONE to the service endpoint.
  • ReleaseServiceInstanceOnTransactionComplete must be set to true on the service implementation.

Once these two things are done, my test program no longer produces out of order messages.

+0

In realtà, 'ReleaseServiceInstanceOnTransactionComplete' deve essere impostato su' false' (come detto nell'ultimo post di [quello stesso thread] (http://social.msdn.microsoft.com/forum/it-IT/WCF/thread/D5E62C68-08FA-492C-BA05-182EC313A54B)). Impostandolo su true provoca un'eccezione di attivazione in runtime. Altrimenti questo sembra risolvere l'ordine. – htuomola