我们已决定在我们的一个队列上启用优先级排队。该实现简单明了,代码更改很小,因此我们对此功能感到非常满意。
我在消费者周围的单元测试中遇到的问题。我们使用大众运输InMemoryTestHarness。 遇到SetPriority方法时,将引发System.ArgumentException'RabbitMqSendContext不可用'。
await context.Publish(message, c => {
c.RequestId = requestId;
c.SetPriority(priority); //throws exception here
});
当我们开始使用直接交换另一个队列时,我们遇到了同样的问题,但是我们可以使用RoutingKeyConventionExtensions中的UseRoutingKeyFormatter方法将其配置移入代码中,并放入总线的配置中。
是否有类似的优先级排队? 还是有一种方法可以保留此代码并仍然使用InMemeroryTestHarness?
答案 0 :(得分:2)
优先级队列是RabbitMQ的一项功能,并且不能通过内存传输来实现。因此测试将无法访问特定于代理的功能。
如果您查看SetPriority
调用,它将调用GetPayload,如果有效负载类型不存在,则会引发异常。您可以更改逻辑以尝试进行设置。
if(c.TryGetPayload<RabbitMqSendContext>(out var rc))
rc.BasicProperties.Priority = priority;
那样,它不会在测试中出错,但是可以对RabbitMQ进行预期的测试。