Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
<img src="//i.stack.imgur.com/WM7S8.png" height="16" width="18" alt="" class="sponsor tag img">servicestack 如何在已注册的处理程序-ServiceStack RabbitMQ中记录响应消息_<img Src="//i.stack.imgur.com/WM7S8.png" Height="16" Width="18" Alt="" Class="sponsor Tag Img">servicestack_Rabbitmq - Fatal编程技术网 servicestack 如何在已注册的处理程序-ServiceStack RabbitMQ中记录响应消息,servicestack,rabbitmq,servicestack,Rabbitmq" /> servicestack 如何在已注册的处理程序-ServiceStack RabbitMQ中记录响应消息,servicestack,rabbitmq,servicestack,Rabbitmq" />

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;
    }
};