MassTransit-InMemoryTestHarness和优先级消息传递

时间:2020-03-06 11:17:32

标签: c# masstransit

我们已决定在我们的一个队列上启用优先级排队。该实现简单明了,代码更改很小,因此我们对此功能感到非常满意。

我在消费者周围的单元测试中遇到的问题。我们使用大众运输InMemoryTestHarness。 遇到SetPriority方法时,将引发System.ArgumentException'RabbitMqSendContext不可用'。

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

当我们开始使用直接交换另一个队列时,我们遇到了同样的问题,但是我们可以使用RoutingKeyConventionExtensions中的UseRoutingKeyFormatter方法将其配置移入代码中,并放入总线的配置中。

是否有类似的优先级排队? 还是有一种方法可以保留此代码并仍然使用InMemeroryTestHarness?

1 个答案:

答案 0 :(得分:2)

优先级队列是RabbitMQ的一项功能,并且不能通过内存传输来实现。因此测试将无法访问特定于代理的功能。

如果您查看SetPriority调用,它将调用GetPayload,如果有效负载类型不存在,则会引发异常。您可以更改逻辑以尝试进行设置。

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

那样,它不会在测试中出错,但是可以对RabbitMQ进行预期的测试。