如何在 AMQP.Net Lite 中处理被拒绝的消息

How to handle rejected messages in AMQP.Net Lite

我在 Web api 和使用 AMQP.Net Lite 的 azure webjob 之间进行了 client/server 设置。

请求客户端看起来像这样:

sender.Send(request, (link, message, outcome, state) => {
        requestOutcome = outcome;   //This indicates accepted even if rejected!
    }, null);
var response = await receiver.ReceiveAsync();
return response.GetBody<TResponse>();

服务器看起来像这样:

try {
    // Process the message and generate response if valid
    var response = await _messageHandler.ProcessAsync(message);
    _receiverLink.Accept(message);
    Logger.Info("Message has been processed");
    if (response != null) {
        _responderLink.Send(new Message(response));
        Logger.Info("Sent response");
    }
} catch (Exception ex) {
    Logger.Error(ex);
    _receiverLink.Reject(message, new Error{Description = ex.Message});
}       

我可以从客户端发送和接收消息,但是在请求失败的情况下,AMQP 似乎有一种机制可以使用 _receiverLink.Reject() 通过其请求结果来处理该消息,而不是显式发送某种类型的消息错误作为回应。根据应该将消息发送到死信队列的 AMQP 文档,我希望这也能向发件人提供拒绝状态作为结果。但是,我得到的是 "accepted" 。

如何从客户端获取 Rejected 状态以便正确处理错误?

更新 我现在看到结果只与传递到队列有关,与接收者无关 accepting/rejecting 因为回调是在服务器处理消息之前收到的。这是否意味着无法从客户端处理拒绝状态?

正确,没有内置方法来处理服务器对发起客户端的拒绝。这是因为您在客户端和服务器之间有一个中间人,即消息代理。代理取得消息的所有权(它不再是 "in flight"),解耦客户端和服务器通信,包括您正在谈论的那种传递状态。

当您的服务器拒绝该消息并且代理将其放置在 DLQ 上时,它被放置在那里只是为了进行带外处理。没有将错误传播回原始客户端的标准行为。

所以,最后,您确实需要针对此场景的错误响应消息。