Служебная шина Azure — сообщение от отправителя дважды ставится в очередьC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Служебная шина Azure — сообщение от отправителя дважды ставится в очередь

Сообщение Anonymous »

Я относительно новичок в Azure Service Bus и очередях сообщений в целом. Ознакомляясь, я столкнулся с чем-то, что поначалу показалось мне неуклюжим, но я все больше запутывался, пытаясь выяснить первопричину.
В очень простое приложение, у меня есть конечная точка, которая передает некоторые жестко запрограммированные данные в общий класс обслуживания «поставить это сообщение в очередь»:

Код: Выделить всё

public class TestFunction(IEventBusService eventBusService)
{
[Function("TestFunction")]
public async Task Run([HttpTrigger(AuthorizationLevel.Function, "get")] HttpRequestData req)
{
try
{
await eventBusService.SendAsync(new TestObject { Message = "Message for service bus", SentAtDateTimeOffset = DateTimeOffset.UtcNow }, Queues.Test);

var response = req.CreateResponse(HttpStatusCode.OK);
await response.WriteAsJsonAsync("Message successfully published to service bus", "application/json");
return response;
}
catch (ServiceBusOperationFailedException)
{
var response = req.CreateResponse(HttpStatusCode.InternalServerError);
await response.WriteAsJsonAsync("Unable to publish message to service bus", "application/json");
return response;
}
}
}

public class TestObject
{
public string Message { get; set; }
public DateTimeOffset SentAtDateTimeOffset { get; set; }
}
Рассматриваемый метод выглядит следующим образом:

Код: Выделить всё

public class EventBusService(ServiceBusClient serviceBusClient) : IEventBusService
{
public async Task SendAsync(T dataToSend, string sendTo, CancellationToken cancellationToken = default)
{
ValidateParams(dataToSend, sendTo);

var serviceBusSender = serviceBusClient.CreateSender(sendTo);
var messageJson = new ServiceBusMessage(JsonSerializer.Serialize(dataToSend));

try
{
await serviceBusSender.SendMessageAsync(messageJson, cancellationToken);
}
catch (Exception ex)
{
throw new ServiceBusOperationFailedException($"Unable to publish message to '{sendTo}'.", ex);
}
finally
{
await serviceBusSender.DisposeAsync();
}
}

private void ValidateParams(T dataToSend, string sendTo)
{
if (dataToSend is null)
throw new ArgumentNullException(nameof(dataToSend));

if (string.IsNullOrEmpty(sendTo))
throw new ArgumentNullException(nameof(sendTo));
}
}
Все кажется достаточно простым.
Чтобы убедиться, что все работает так, как ожидалось, я составил быстрый тест, который вызывал бы конечную точку...

Код: Выделить всё

    [TestMethod]
public async Task Should_OnSuccessfulPublishToEventBus_ReceiveConfirmationMessage()
{
// Arrange
var testFunction = new TestFunction(EventBusHelper.CreateService());

var mockFunctionContext = EventBusHelper.GetMockFunctionContext();

//Act
var response = await testFunction.Run(new TestHttpRequestData(mockFunctionContext));

//Assert
Assert.IsNotNull(response);
Assert.AreEqual(HttpStatusCode.OK, response.StatusCode);

response.Body.Position = 0;
using var streamReader = new StreamReader(response.Body);
var responseBody = await streamReader.ReadToEndAsync();

Assert.AreEqual("\"Message successfully published to service bus\"", responseBody);
}
...и проверьте результат с помощью Service Bus Explorer.
Однако, когда я посмотрел на сообщения в очереди, я увидел то же самое сообщение было добавлено в очередь дважды. С тех пор это происходило каждый раз, когда я запускал тест.
Предварительный запуск теста:
[img]https://i .sstatic.net/oJgdqLIA.png[/img]

После тестового запуска:
[img]https://i.sstatic .net/IYUaJB5W.png[/img]

Исходя из моего кода выше, есть ли какая-то причина, по которой это происходит? Я отладил и убедился, что конечная точка затрагивается только один раз, поэтому могу только думать, что это какая-то сложность организации очереди сообщений, о которой я не знаю. Любая помощь или совет приветствуются!
Спасибо,
Марк

Подробнее здесь: https://stackoverflow.com/questions/785 ... eued-twice
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Срок действия аутентификации CBS истек — служебная шина Azure
    Anonymous » » в форуме Python
    0 Ответы
    15 Просмотры
    Последнее сообщение Anonymous
  • Срок действия аутентификации CBS истек — служебная шина Azure
    Anonymous » » в форуме Python
    0 Ответы
    11 Просмотры
    Последнее сообщение Anonymous
  • Служебная шина Azure — удаление определенного сообщения
    Anonymous » » в форуме C#
    0 Ответы
    7 Просмотры
    Последнее сообщение Anonymous
  • Можно ли отследить отправителя, если запрос отправителя относится к приложению, которое еще не установлено?
    Гость » » в форуме IOS
    0 Ответы
    40 Просмотры
    Последнее сообщение Гость
  • Как текущая очередь, очередь отправки и целевая очередь взаимодействуют друг с другом в GCD?
    Anonymous » » в форуме IOS
    0 Ответы
    105 Просмотры
    Последнее сообщение Anonymous

Вернуться в «C#»