Как проверить наличие указанной c записи в теме azure служебной шины - PullRequest
0 голосов
/ 02 апреля 2020

Как проверить, существует ли указанная c запись в azure служебной шине topi c. В моем случае несколько клиентов вводят запись в служебную шину topi c, поэтому мне нужно проверить существующую запись. Если в topi c нет записи, введите ее. мне нужно проверить запись в SendMessageAsyn c метод следующий мой код

    private ITopicClient client;
    private DateTime tokenExpiresAtUtc = DateTime.MinValue;
    private string tokenValue = string.Empty;
    public async Task SendOrderMessageAsync(string OrderNumber, int RecipientStoreId)
    {
        await SendMessageAsync(GetMessage(JsonConvert.SerializeObject(new OrderNotificationViewModel
        {
            SenderStoreId = this.SenderStoreId.Value,
            NotificationType = NotificationTypes.Order,
            OrderNumber = OrderNumber,
            StoreId = RecipientStoreId
        })), RecipientStoreId);

    }
    private async Task SendMessageAsync(Message message, int StoreId)
    {
        try
        {
            await (await GetClient(GetTopicName(StoreId))).SendAsync(message);
        }
        catch (MessagingEntityNotFoundException ex)
        {
            var topic = await CreateTopic(GetTopicName(StoreId));
            var subscription = await CreateSubscription(topic.Name, GetSubscriptionName(StoreId));
            await (await GetClient(GetTopicName(StoreId))).SendAsync(message);
        }
    }
    public async Task SendOrderNotesMessageAsync(string OrderNumber, List<string> Notes, int RecipientStoreId)
    {
        await SendMessageAsync(GetMessage(JsonConvert.SerializeObject(new OrderNotesNotificationViewModel
        {
            SenderStoreId = this.SenderStoreId.Value,
            NotificationType = NotificationTypes.OrderNotes,
            OrderNumber = OrderNumber,
            Notes = Notes,
            StoreId = RecipientStoreId
        })), RecipientStoreId);
    }
    private async Task<ITopicClient> GetClient(string TopicName)
    {
        if (client != null && client.TopicName != TopicName)
        {
            await client.CloseAsync();
            client = null;
        }
        if (client == null)
        {
            client = new TopicClient(GlobalConfig.Instance.ServiceBusConnectionString, TopicName);
        }
        return client;
    }
    private string GetTopicName(int StoreId)
    {
        return GlobalConfig.Instance.ServiceBusTopicNamePattern.Replace("{StoreId}", StoreId.ToString());
    }
    private string GetSubscriptionName(int StoreId)
    {
        return GlobalConfig.Instance.ServiceBusSubscriptionNamePattern.Replace("{StoreId}", StoreId.ToString());
    }
    private Message GetMessage(string messageBody)
    {
        return new Message(Encoding.UTF8.GetBytes(messageBody));
    }

1 Ответ

2 голосов
/ 02 апреля 2020

Не делай этого. Service Bus - это служба обмена сообщениями, а не хранилище данных. Темы специально предназначены для многоадресной передачи и отделения отправителей / издателей от получателей / подписчиков.

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

...