Заказанная поставка с netMSMQbinding - PullRequest
5 голосов
/ 08 апреля 2009

Можно ли гарантировать заказанную доставку при использовании WCF netMSMQbinding?

Мы помещаем команду вставки с последующим рядом команд обновления в одну и ту же очередь, и иногда одно из обновлений превосходит вставку.

После добавления расширенной регистрации ясно, что они добавляются в очередь в правильном порядке и обрабатываются в другом порядке.

Мне удалось найти в Google несколько статей, в которых говорится, что такое поведение ожидается, но, похоже, необходимо настроить его так, чтобы его можно было как-то упорядочить.

Наши очереди транзакционные, поэтому я не думаю, что добавление порядковых номеров и повторное упорядочение в месте назначения сработает, так как это приведет к потере транзакционности

Если я добавлю атрибут [DeliveryRequirements(RequireOrderedDelivery=true, QueuedDeliveryRequirements=QueuedDeliveryRequirementsMode.Require)], я получу следующую ошибку:

Атрибут DeliveryRequirementsAtribute в контракте «IService» определяет Значение QueuedDeliveryRequirements NotAllowed. Однако настроенный Привязка для этого контракта указывает, что он поддерживает поставку в очереди. Связывание в очереди не может использоваться с этим контрактом.

Я понятия не имею, почему мы получаем эту ошибку, поскольку все «кажется» настроено правильно. Мне так и не удалось найти подтверждения, что этот параметр разрешен для MSMQ, так как он выглядит как параметр WS-RM, а AFAIK netMSMQBinding не поддерживает WS-RM.

Ответы [ 3 ]

3 голосов
/ 08 апреля 2009

MSMQ не поддерживает заказанную доставку, следовательно, вы не можете.

Посмотрите на System.ServiceModel.Channels.MsmqBindingElementBase + BindingDeliveryCapabilitiesHelper, который является классом, определяющим возможности привязки MSMQ, и как он реализует это свойство:

bool IBindingDeliveryCapabilities.AssuresOrderedDelivery
{
    get
    {
        return false;
    }
}
2 голосов
/ 17 августа 2009

Это сообщение от Саймона Гиттинса выглядит так, как будто предполагает, что заказанная доставка возможна:

Как оказалось, есть недокументированная функция, которая имеет дело с этой ситуацией:

  • Применение TransactedBatchingBehavior с размером пакета ОДИН к конечной точке службы.
  • ReleaseServiceInstanceOnTransactionComplete должен иметь значение true для реализации службы.

Как только эти две вещи будут выполнены, моя тестовая программа больше не будет выводить из строя сообщения.

1 голос
/ 10 апреля 2009

Похоже, вы можете группировать сообщения, поэтому вы можете указать порядок в договоре. Ознакомьтесь с этой статьей MSDN о группировке сообщений .

...