servicestack 如何在已注册的处理程序-ServiceStack RabbitMQ中记录响应消息
给出这段代码:servicestack 如何在已注册的处理程序-ServiceStack RabbitMQ中记录响应消息,servicestack,rabbitmq,servicestack,Rabbitmq,给出这段代码: //DirectApi mqServer.RegisterHandler<LeadInformationInfo>(m => { repository.SaveMessage(m as Message); LeadInformationInfoResponse response = new LeadInformationInfoResponse(); try { var client = new JsonServi
//DirectApi
mqServer.RegisterHandler<LeadInformationInfo>(m =>
{
repository.SaveMessage(m as Message);
LeadInformationInfoResponse response = new LeadInformationInfoResponse();
try
{
var client = new JsonServiceClient(settingsFactory.GetMasterSetting("ProcessorApi:baseUri"));
response = client.Post(m.GetBody());
}
catch (WebServiceException webServiceException)
{
_log.Error("RegisterHandler<LeadInformationInfo>", webServiceException);
response = ((LeadInformationInfoResponse) webServiceException.ResponseDto);
response.CorrelationId = m.Id;
}
// Log response message here
return response;
}, 1);
//DirectApi
mqServer.RegisterHandler(m=>
{
repository.SaveMessage(m作为消息);
LeadInformationInfoResponse响应=新的LeadInformationInfoResponse();
尝试
{
var client=newjsonserviceclient(setingsfactory.GetMasterSetting(“ProcessorApi:baseUri”);
response=client.Post(m.GetBody());
}
捕获(WebServiceException WebServiceException)
{
_log.Error(“RegisterHandler”,webServiceException);
响应=((LeadInformationInfoResponse)webServiceException.ResponseTo);
response.CorrelationId=m.Id;
}
//在此记录响应消息
返回响应;
}, 1);
我已经尽了很大的努力来确保基于原始message Id属性的correlationId在该消息以及由此操作生成的任何子消息的生命周期中传播。如何获取响应消息的句柄,以便将其记录到处理程序中?我只能访问ResponseDto,不能访问消息
此请求的原因之一是消息队列客户端没有访问数据库的权限,只有注册了处理程序的进程才有访问权限。希望这能更好地解释情况
只是澄清一下,这个问题是关于在处理程序中持久化MQ响应消息的,相关Id是1请求/响应工作流中所有消息都将共享的。我还使用ServiceStack或MLite来持久化消息对象,因此按ID查询此表以进行故障排除是至关重要的
谢谢,,
Stephen您正在从MQ处理程序中调用Web服务:
var client = new JsonServiceClient(...);
response = client.Post(m.GetBody());
因此,没有仅在MQ服务中可用的MQ响应。尽管Web服务将返回发送的请求的响应,因此您可以在MQ请求上使用CorrelationId,否则您可以使用响应数据来实现像IHasCorrelationId
这样的接口,并以这种方式获得它,例如:
var correlationResponse = response as IHasCorrelationId;
if (correlationResponse != null)
{
var correlationId = correlationResponse.CorrelationId;
}
创建自己的消息实例
作为消息
类,如果要创建自己的实例,可以初始化自己的实例:
var mqResponse = new Message<Response>(response);
使用
如果您只想记录传入和传出的消息,可以使用,例如:
我知道调用web服务或在处理程序主体内使用ServiceController.ExecuteMessage都将返回ResponseDto,而不是消息,因为它将被传递到MQ客户端(RabbitMQ RPC)。是的,我可以检索correlationId,我希望保留的是IMessage响应。mythz,这对我来说不太合适:)但既然消息是一个POCO,我就实例化它并保存它,没有人会更聪明。@Stephen MessageHandler实际上就是这么做的。如果您只想记录日志,您可以在RabbitMqServer上使用PublishMessageFilter和GetMessageFilter,请参阅。请在回答中阐明最后一条评论。
var mqResponse = MessageFactory.Create(response);
var mqServer = new RabbitMqServer("localhost")
{
PublishMessageFilter = (queueName, properties, msg) => {
properties.AppId = "app:{0}".Fmt(queueName);
},
GetMessageFilter = (queueName, basicMsg) => {
var props = basicMsg.BasicProperties;
receivedMsgType = props.Type; //automatically added by RabbitMqProducer
receivedMsgApp = props.AppId;
}
};