Nano Hash - криптовалюты, майнинг, программирование

Как отложить сообщение служебной шины Azure?

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

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

API отсрочки сообщений API BrokeredMessage.Defer или BrokeredMessage.DeferAsync в клиенте .NET Framework, MessageReceiver.DeferAsync в клиенте .NET Standard и IMessageReceiver.defer или IMessageReceiver.deferAsync в клиенте Java.

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

Обновление по просьбе @Gaurav

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

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

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

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

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

27.02.2020

Ответы:


1

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:

введите здесь описание изображения

27.02.2020
  • это не работает должным образом, я устанавливаю это значение, но оно все еще отправляет множество сообщений снова и снова. Как сообщить служебной шине, что я установил это значение? 27.02.2020
  • я обновил свой вопрос кодом, который я пробовал, и тем, что я собираюсь попробовать 27.02.2020
  • Обновил мой ответ. ХТН. 28.02.2020
  • спасибо за усилия, @Gaurav, но я получаю сообщения, а не отправляю, и «вернись через час», по-видимому, не сработает (говорит босс). Мне нужна функциональность, которую я видел в подсказках документации, в которой говорится, что я могу ответить на сообщение с отсрочкой, а затем закрыть с помощью sequenceNumber по своему усмотрению. 28.02.2020
  • Я думаю, что @Ninjanoel неправильно понял цель этого решения - оно обходит сложность отсрочки сообщения путем повторной публикации исходного сообщения. 16.04.2021

  • 2

    Использование API-интерфейсов отсрочки сообщений, таких как BrokeredMessage.Defer или BrokeredMessage.DeferAsync, приведет к отсрочке сообщения.

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

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

    03.03.2020

    3

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

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

    public async Task InitialiseAndRunMessageReceiver()
    

    запустить бесконечный цикл, который читает сообщение

    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, и завершите сообщение, как если бы оно не было отложено.

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

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

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

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

    06.03.2020

    4

    Старый вопрос, но что подходило для моей ситуации, так это удаление сообщения и публикация копии с помощью ScheduleMessageAsync (где-то есть метод копирования). Тогда сообщение просто вернется в нужное время.

    18.10.2020
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

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

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

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

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..