MassTransit - InMemoryTestHarness и приоритетные сообщения - PullRequest
0 голосов
/ 06 марта 2020

Мы решили включить приоритетную очередь в одной из наших очередей. Реализация этого проста, а изменение кода невелико, поэтому мы очень довольны этой функцией.

Проблема, с которой я столкнулся, связана с модульным тестом для потребителя. Мы используем Mass Transits InMemoryTestHarness. Когда он срабатывает, метод SetPriority создает исключение System.ArgumentException «RabbitMqSendContext не был доступен».

await context.Publish(message, c => { 
    c.RequestId = requestId; 
    c.SetPriority(priority); //throws exception here
});

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

Есть ли что-то похожее для приоритетной очереди? Или есть способ, которым я могу сохранить этот код и все еще использовать InMemeroryTestHarness?

1 Ответ

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

Приоритетные очереди являются функцией RabbitMQ, и они не реализуются транспортом в памяти. Таким образом, тесты не смогут получить доступ к спецификациям брокера c.

Если вы посмотрите на вызов SetPriority, он вызывает GetPayload, который выдает исключение, если тип полезной нагрузки не ' не существует. Вы можете изменить свою логику c, чтобы попытаться установить ее, если она доступна.

if(c.TryGetPayload<RabbitMqSendContext>(out var rc))
    rc.BasicProperties.Priority = priority;

Таким образом, она не будет ошибаться при тестировании, но будет работать, как и ожидалось, с RabbitMQ.

...