Как отложить сообщение Azure Service Bus? - PullRequest
1 голос
/ 27 февраля 2020

Текущий я использую Microsoft.Azure.ServiceBus.IQueueClient до RegisterMessageHandler, а затем полученное сообщение имеет тип Microsoft.Azure.ServiceBus.Message.

Согласно документации :

API отложенных сообщений. API - это BrokeredMessage.Defer или BrokeredMessage.DeferAsyn c в клиенте. NET Framework, MessageReceiver.DeferAsyn c в стандартном клиенте. NET и IMessageReceiver.defer или IMessageReceiver.deferAsyn c в клиенте Java.

... но ни одна из этих библиотек не соединяется с классами, которые я на самом деле использую. Как мне отложить? Какие классы и вещи я должен использовать, чтобы иметь возможность откладывать сообщения? Все приведенные выше примеры не дают достаточно фрагментов кода, чтобы объяснить это.

Обновление по запросу @ Gaurav

из вашего ответа, я вижу мое сообщение имеет это свойство:

message.ScheduledEnqueueTimeUtc = DateTime.UtcNow.AddHours(1);

, но queueClient также имеет этот метод:

queueClient.ScheduleMessageAsync(message, DateTime.UtcNow.AddHours(1));

Я собираюсь попробовать 'scheduledMessageAsync', поскольку я не могу понять, как сообщить, что я установил ScheduledEnqueueTimeUtc без вызова queueClient

Ответы [ 3 ]

2 голосов
/ 27 февраля 2020

Microsoft.Azure.ServiceBus.Message имеет свойство с именем ScheduledEnqueueTimeUtc. Просто установите значение этого свойства на значение даты / времени в будущем, когда вы хотите, чтобы сообщение появилось в очереди. Сообщение будет скрыто до этого времени и появится в очереди только в эту дату / время.

ОБНОВЛЕНИЕ

Итак, я выполнил тест и подтвердил, что оба ScheduledEnqueueTimeUtc и ScheduleMessageAsync работает. Я использовал версию 4.1.1 для Microsoft.Azure.ServiceBus SDK.

Вот код, который я написал:

    static void Main(string[] args)
    {
        var connectionString = "my-connection-string";
        var queueName = "test";
        QueueClient queueClient = new QueueClient(connectionString, queueName);
        Message msg1 = new Message()
        {
            Body = Encoding.UTF8.GetBytes("This message has ScheduledEnqueueTimeUtc property set. It will appear in queue after 2 minutes. Current date/time is: " + DateTime.Now),
            ScheduledEnqueueTimeUtc = DateTime.UtcNow.AddMinutes(2)
        };
        queueClient.SendAsync(msg1).GetAwaiter().GetResult();
        Message msg2 = new Message()
        {
            Body = Encoding.UTF8.GetBytes("This message is sent via ScheduleMessageAsync method. It will appear in queue after 2 minutes. Current date/time is: " + DateTime.Now)
        };
        queueClient.ScheduleMessageAsync(msg2, new DateTimeOffset(DateTime.UtcNow.AddMinutes(2))).GetAwaiter().GetResult();
        Console.ReadLine();
    }

И вот что я вижу, когда выбираю сообщения в режиме Peek-Lock:

enter image description here

1 голос
/ 03 марта 2020

Использование API отложенных сообщений, таких как BrokeredMessage.Defer или BrokeredMessage.DeferAsyn c, будет откладывать сообщение.

Отсрочка сообщения изменит состояние сообщения с Активно на Отложено . Позднее сообщение может быть получено на основе порядкового номера.

ScheduleMessageAsyn c () используется для планирования доставки сообщения (отправляет сообщение в указанное время). Его нельзя использовать после получения сообщения.

0 голосов
/ 06 марта 2020

Я кодировал решение, которое искал, вот базовая схема c:

внутри асинхронного метода (запускает собственный поток)

public async Task InitialiseAndRunMessageReceiver()

запускаем бесконечный l oop, который читает сообщение

receiver = new MessageReceiver(serviceBusConnectionString, serviceBusQueueName, ReceiveMode.PeekLock); 
while (true) { var message = await receiver.ReceiveAsync(); ... more code... }

, как только вы знаете, что собираетесь запустить длинное задание, отложите сообщение, но сохраните message.SystemProperties.SequenceNumber. это удерживает его в очереди, но предотвращает повторную доставку.

await receiver.DeferAsync(message.SystemProperties.LockToken);

и, когда вы, наконец, закончили, снова запросите сообщение, используя message.SystemProperties.SequenceNumber, и завершите сообщение, как если бы оно не было deferred

var message = receiver.ReceiveDeferredMessageAsync(message.SystemProperties.SequenceNumber);
receiver.CompleteAsync(message.Result.SystemProperties.LockToken);

, и ваше сообщение будет удалено из очереди.

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

Microsoft.Azure.ServiceBus.Core.MessageReceiver получатель сообщения выше

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