如何在AMQP.Net Lite中处理拒绝的邮件

时间:2018-09-27 14:56:21

标签: .net amqp

我使用AMQP.Net Lite在Web api和Azure Webjob之间进行了客户端/服务器设置。

发出请求的客户端如下所示:

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文档,应该将消息发送到死信队列,我希望这也可以将拒绝状态作为结果发送给发件人。但是,我得到的却是“被接受”。

如何从客户端获取“已拒绝”状态以适当地处理错误?

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

1 个答案:

答案 0 :(得分:1)

正确的,没有内置的方法可以处理来自启动客户端的服务器拒绝。这是因为您在客户端和服务器之间有一个中介,即消息代理。代理获得消息的所有权(不再是“运行中”),使客户端和服务器之间的通信脱钩,包括您正在谈论的传递状态。

当您的服务器拒绝该消息并将代理放置在DLQ上时,该消息仅用于带外处理。没有标准的行为可以将错误传播回原始客户端。

因此,最后,您确实需要针对这种情况的错误响应消息。