2009-04-08 17 views
5

¿Es posible garantizar la entrega ordenada cuando se usa WCF netMSMQbinding?Entrega ordenada con netMSMQbinding

Estamos colocando un comando de inserción seguido de una serie de comandos de actualización en la misma cola, y ocasionalmente una de las actualizaciones supera a la inserción.

Al haber agregado un registro extenso, está claro que se están agregando a la cola en el orden correcto y se están procesando en un orden diferente.

He logrado buscar en Google un par de artículos que afirman que se espera este comportamiento, pero parece que debe ser posible configurarlo de alguna manera.

Nuestros colas son transaccionales, por lo que no creo que la adición de números de secuencia y resecuenciación en el destino que se va a trabajar, ya que ello perder transaccionalidad

Si añado el atributo [DeliveryRequirements(RequireOrderedDelivery=true, QueuedDeliveryRequirements=QueuedDeliveryRequirementsMode.Require)] me sale el siguiente error :

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.

no tengo ni idea de por qué tenemos este error, ya que todo "parece" ser configurado correctamente. No he logrado encontrar ninguna confirmación de que esta configuración esté permitida para MSMQ, ya que parece ser una configuración de WS-RM, y AFAIK netMSMQBinding no es compatible con WS-RM.

+0

que presentaron un error de conexión en este tema, no es exactamente el mismo problema que tenías, pero lo suficientemente cerca ... También tengo una solución en el error de conexión. Compruébelo aquí: https://connect.microsoft.com/VisualStudio/feedback/details/1107645/wcf-receives-messages-from-msmq-out-of-order –

Respuesta

3

MSMQ no es compatible con la entrega ordenada, por lo tanto, no puede.

Tome un vistazo a System.ServiceModel.Channels.MsmqBindingElementBase + BindingDeliveryCapabilitiesHelper que es la clase especificando capacidades de unión de MSMQ, y cómo se implementa esa propiedad:

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

Perfecto. Solo la respuesta definitiva que estaba buscando. Puedo volver al trabajo del día ahora :) – Modan

2

This post from Simon Gittins parece que sugiere que la entrega ordenada es posible:

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

En realidad, 'ReleaseServiceInstanceOnTransactionComplete' tiene que establecerse en' false' (como se dijo en la última publicación de [ese mismo hilo] (http://social.msdn.microsoft.com)/forums/en-us/wcf/thread/D5E62C68-08FA-492C-BA05-182EC313A54B)). Establecerlo en verdadero causa una excepción de activación en el tiempo de ejecución. De lo contrario, esto parece arreglar el orden. – htuomola

Cuestiones relacionadas