отправить сообщение в тему служебной шины

У меня есть код C # для отправки сообщения в тему служебной шины следующим образом:

public class ServiceBusTopicsRepository : IServiceBusTopicsRepository
{
    private TopicClient _topicClient;

    public ServiceBusTopicsRepository(string connectionString, string entityPath)
    {
        _topicClient = new TopicClient(connectionString, entityPath);
    }

    public async Task AddMessageAsync(SyncJob job)
    {
        await _topicClient.SendAsync(CreateMessage(job));
    }

    private Message CreateMessage(SyncJob job)
    {
        var body = JsonSerializer.Serialize(job);
        var message = new Message
        {
            Body = Encoding.UTF8.GetBytes(body)
        };

        message.MessageId = "PK_RK";

        return message;
    }
}

При запуске кода, когда он достигает точки останова после строки:

ждать _topicClient.SendAsync (CreateMessage (job));

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

DuplicateDetectionHistoryTimeWindow - 10 мин.

Когда я пытаюсь отправить сообщение через 12 минут, я вижу, что новое отправленное сообщение немедленно игнорируется и отбрасывается. Глядя на этот документ https://docs.microsoft.com/en-us/azure/service-bus-messaging/duplicate-detection, я вижу, что если какое-либо новое сообщение отправляется с MessageId, которое было зарегистрировано в течение временного окна (10 минут), сообщение отображается как принято (операция отправки завершается успешно), но новое отправленное сообщение немедленно игнорируется и отбрасывается. Однако похоже, что он игнорирует сообщение даже через 10 мин.

Я попытался обновить MessageId до PK_RK + random GUID. Я все еще вижу ту же проблему.


person user989988    schedule 03.03.2021    source источник
comment
Существуют ли какие-либо фильтры в подписках: docs.microsoft.com/en-us/azure/service-bus-messaging/ Кроме того, существует ли приложение, использующее эти сообщения вне подписки (подписок)? Похоже, у вас может быть несколько потребителей / несколько экземпляров потребителя, пытающихся заблокировать одно и то же сообщение. Это сообщение также может появиться, если потребителю требуется много времени для выполнения и срок блокировки сообщения истек. См. Этот ответ: stackoverflow.com/questions/15303711/   -  person Aaron Newton    schedule 04.03.2021


Ответы (1)


Проблема с отправляющим кодом маловероятна.

Как мне обновить приведенный ниже код, чтобы проверить, добавлено ли сообщение в тему или нет.

Вы этого не сделаете. Когда сообщение успешно отправлено, это означает, что брокер получил его, и оно гарантированно находится на сервере. Что вам следует сделать, так это убедиться, что сообщение не было отброшено или обработано без уведомления. Самый простой способ проверить это - создать всеобъемлющую подписку в теме, которая собирает все сообщения и проверяет, были ли отправлены ваши сообщения или нет. Я не рекомендую это делать за пределами вашей среды разработки / тестирования, так как это не то, что вам следует делать в производственной среде.

person Sean Feldman    schedule 03.03.2021
comment
Спасибо! Не могли бы вы предоставить образец кода для создания всеобъемлющей подписки по теме? - person user989988; 04.03.2021
comment
@ user989988 или можно просто отключить подписчиков. Затем вы увидите, что сообщения накапливаются, пока вы не включите их. - person mason; 04.03.2021
comment
Спасибо! Я отключил подписку. Я заметил, что сообщение не добавляется в тему. - person user989988; 04.03.2021
comment
@ user989988, если сообщение не добавлено в тему и не генерируется исключение, то это либо настройка темы, либо ваш код отправителя отключен. Поделитесь репродукцией где-нибудь, пожалуйста. Держите секреты подальше от публичного репо. - person Sean Feldman; 04.03.2021
comment
Спасибо! Вот код в моем репо: github.com/microsoftgraph/group-membership-management/blob/ (строка 81) - person user989988; 04.03.2021
comment
Это не репортаж, чувак ???? - person Sean Feldman; 04.03.2021
comment
Я вижу это исключение в аналитических сведениях о приложении: поставленная блокировка недействительна. Либо срок блокировки истек, либо сообщение уже удалено из очереди. Не уверен, может ли это быть проблемой. - person user989988; 04.03.2021
comment
Блокировка используется при получении и обработке сообщений, а не при отправке. - person Sean Feldman; 04.03.2021
comment
Давайте продолжим это обсуждение в чате. - person Sean Feldman; 04.03.2021