我使用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文档,应该将消息发送到死信队列,我希望这也可以将拒绝状态作为结果发送给发件人。但是,我得到的却是“被接受”。
如何从客户端获取“已拒绝”状态以适当地处理错误?
更新 我现在看到的结果仅与传递到队列有关,而不与接收者接受/拒绝它有关,因为在服务器处理消息之前已收到回调。这是否意味着无法处理来自客户端的拒绝状态?
答案 0 :(得分:1)
正确的,没有内置的方法可以处理来自启动客户端的服务器拒绝。这是因为您在客户端和服务器之间有一个中介,即消息代理。代理获得消息的所有权(不再是“运行中”),使客户端和服务器之间的通信脱钩,包括您正在谈论的传递状态。
当您的服务器拒绝该消息并将代理放置在DLQ上时,该消息仅用于带外处理。没有标准的行为可以将错误传播回原始客户端。
因此,最后,您确实需要针对这种情况的错误响应消息。