2009-04-08 12 views
5

Ist es möglich, eine geordnete Lieferung zu garantieren, wenn Sie WCF netMSMQbinding verwenden?Bestellte Lieferung mit netMSMQbinding

Wir fügen einen Insert-Befehl ein, gefolgt von einer Anzahl von Update-Befehlen in derselben Warteschlange, und gelegentlich schlägt eine der Aktualisierungen die Einfügung.

Nachdem eine umfangreiche Protokollierung hinzugefügt wurde, ist es klar, dass sie der Warteschlange in der richtigen Reihenfolge hinzugefügt und in einer anderen Reihenfolge verarbeitet werden.

Ich habe Google ein paar Artikel, die behaupten, dass dieses Verhalten erwartet wird, aber es scheint wie es möglich sein muss konfiguriert, um es irgendwie bestellt werden.

Unsere Warteschlangen sind Transaktions-, so dass ich glaube nicht, dass Sequenznummern hinzufügen und Resequenzierung am Ziel arbeiten werde, so dass Transaktionalität

Wenn ich das [DeliveryRequirements(RequireOrderedDelivery=true, QueuedDeliveryRequirements=QueuedDeliveryRequirementsMode.Require)] ich folgende Fehler Attribut hinzufügen würde verlieren bekommen :

Ich habe keine Ahnung, warum wir diesen Fehler bekommen, wie alles "erscheint" um richtig eingerichtet zu werden. Ich habe jedoch keine Bestätigung gefunden, dass diese Einstellung für MSMQ zulässig ist, da es sich um eine WS-RM-Einstellung handelt und AFAIK netMSMQBinding WS-RM nicht unterstützt.

+0

ich einen connect Bug zu diesem Thema eingereicht, nicht genau das gleiche Problem wie Sie hatten, aber nahe genug ... Ich habe auch eine Lösung im Verbindungsfehler. Schau es dir hier an: https://connect.microsoft.com/VisualStudio/feedback/details/1107645/wcf-receifes-messages-from-msmq-out-order –

Antwort

3

MSMQ unterstützt keine geordnete Zustellung, daher können Sie dies nicht tun.

Werfen Sie einen Blick auf System.ServiceModel.Channels.MsmqBindingElementBase + BindingDeliveryCapabilitiesHelper, die die Klasse MSMQ Bindungsfähigkeiten spezifiziert ist, und wie es implementiert diese Eigenschaft:

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

Perfekt. Genau die definitive Antwort, nach der ich gesucht habe. Ich kann jetzt wieder zum Tagesjob zurückkehren :) – Modan

2

This post from Simon Gittins sieht aus wie schlägt er vor, bestellten Lieferung möglich:

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

Eigentlich muss 'ReleaseServiceInstanceOnTransactionComplete' auf' false' gesetzt werden (wie im letzten Beitrag von [derselbe Thread] (http://social.msdn.microsoft.com)/forums/de/de/wcf/thread/D5E62C68-08FA-492C-BA05-182EC313A54B)). Wenn Sie es auf "true" setzen, wird in Runtime eine Aktivierungsausnahme ausgelöst. Sonst scheint dies die Ordnung zu beheben. – htuomola

Verwandte Themen