Продажи: 1-800-867-1389

Использование метода BrokeredMessage.Defer

Обновлено: Январь 2013 г.

При использовании класса BrokeredMessage имеется возможность оставить сообщение в очереди с помощью метода Defer. Отложенное сообщение может быть обработано позже, на ваше усмотрение. Откладывание сообщений удобно для определения их приоритетности или задержки обработки сообщений, которые зависят от какого-либо другого процесса. После обработки сообщения вызовите метод Complete, чтобы удалить сообщение из очереди.

Чтобы использовать метод Defer или Complete, задайте режим клиента очереди ReceiveMode.PeekLock. Для этого вызовите метод CreateQueueClient класса MessagingFactory.

При откладывании сообщения добавьте в коллекцию SequenceNumber сообщения. Чтобы извлечь сообщение, вызовите метод Receive класса QueueClient. Передайте последовательный номер сообщения в метод Receive в качестве аргумента.

noteПримечание
Чтобы обеспечить повторный вызов сообщения, храните последовательные номера в надежном хранилище. В противном случае, если процесс завершится со сбоем, запись об отложенных сообщениях будет утрачена.

При необходимости завершить откладывание, вызовите метод Complete для каждого сообщения.

Пример приложения, в котором демонстрируется метод Defer, см. в статье: Brokered Messaging: Deferred Messages (Обмен сообщениями через посредник: отложенные сообщения).

  1. Добавьте ссылки на следующие пространства имен.

    using Microsoft.ServiceBus.Messaging;
    using Microsoft.ServiceBus;
    
    
  2. Создайте экземпляр MessagingFactory и вызовите метод CreateQueueClient. Чтобы создать сущность MessagingFactory, извлеките универсальный код ресурса (URI) пространства имен Service Bus, имя издателя (по умолчанию: «owner») и ключ доступа с портала управления платформой Azure.

    private static QueueClient CreateQueueClient(string queueName) 
    {
        // The serviceBusNamespace and serviceBusIssuerKey return the values specific to an Azure account. 
        string serviceBusIssuerKey = "yourServiceBusIssuerKey";
        string serviceBusNamespace = "yourServiceBusNamespace";
        string serviceBusIssuerName = "owner" ' The default is 'owner'.
        Uri runtimeUri = ServiceBusEnvironment.CreateServiceUri("sb", serviceBusNamespace, string.Empty);
        MessagingFactory messagingFactory = MessagingFactory.Create(runtimeUri, 
            TokenProvider.CreateSharedSecretTokenProvider(serviceBusIssuerName, serviceBusIssuerKey));
        return messagingFactory.CreateQueueClient(queueName,ReceiveMode.PeekLock); 
    } 
    
    

  1. Создайте универсальный список типа long для хранения чисел.

    List<long> deferredSequenceNumbers = new List<long>();
    
  2. Вызовите метод Receive для клиента. Проверьте каждое сообщение на соответствие условию откладывания и при необходимости вызовите метод Defer. Добавьте последовательный номер в коллекцию списков.

    BrokeredMessage receivedMessage = queueClient.Receive(TimeSpan.FromSeconds(10));
        if (receivedMessage == null)
        {
            break;
        }
        else
        {
            // Low-priority messages will be dealt with later:
            if (receivedMessage.Properties["Priority"].ToString() == "Low")
            {
               receivedMessage.Defer();
               Console.WriteLine("Deferred message with id {0}.", receivedMessage.MessageId);
               // Deferred messages can only be retrieved by message receipt. Here, keeping track of the
               // message receipt for a later retrieval: 
               deferredSequenceNumbers.Add(receivedMessage.SequenceNumber);
         }
         else
         {
               ProcessMessage(receivedMessage);
         }
      
    
    
    Dim receivedMessage As BrokeredMessage = myQueueC.Receive(TimeSpan.FromSeconds(10))
    If receivedMessage Is Nothing Then
        Resume
     Else
     
        ' Low-priority messages will be dealt with later:
        If receivedMessage.Properties("Priority").ToString() = "Low" Then
     
         receivedMessage.Defer()
         Console.WriteLine("Deferred message with id {0}.", receivedMessage.MessageId)
         ' Deferred messages can only be retrieved by message receipt. Here, keeping track of the
         '  message receipt for a later retrieval: 
         deferredSequenceNumbers.Add(receivedMessage.SequenceNumber)
        Else
            ProcessMessage(receivedMessage)
        End If
     End If
    
    

  1. Выполните итерацию по коллекции последовательных номеров, используя метод Receive.

    foreach (long sequenceNumber in deferredSequenceNumbers)
    {
        ProcessMessage(queueClient.Receive(sequenceNumber));
    }
    
  2. Метод ProcessMessage вызывает метод Complete для каждого сообщения.

    private static void ProcessMessage(BrokeredMessage message)
    {
        // To do: code to process the message.
        message.Complete();
    }
    
    

Пример приложения, в котором демонстрируется метод Defer, см. в статье: Brokered Messaging: Deferred Messages (Обмен сообщениями через посредник: отложенные сообщения).

См. также

Была ли вам полезна эта информация?
(1500 символов осталось)
Спасибо за ваш отзыв
Показ:
© 2014 Microsoft