如何在已注册的处理程序 - ServiceStack RabbitMQ中记录响应消息

时间:2015-01-23 19:31:43

标签: servicestack rabbitmq

给出这段代码:

//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);

我已经竭尽全力确保基于原始邮件Id属性的correlationId在此邮件的生命周期内传播,并且此操作产生的所有子邮件都会传播。如何获取响应消息的句柄,以便我可以将其记录在处理程序中?我只能访问ResponseDto而不是消息。

此请求的原因之一是消息队列客户端无权访问数据库,只有已注册处理程序的进程才有权访问数据库。希望更好地解释情况。

为了澄清,这个问题是关于在处理程序中持久化MQ响应消息,相关ID是1个请求/响应工作流中的所有消息将共享的内容。我还使用ServiceStack ORMlite来持久化Message对象,因此通过ID查询此表以进行故障排除是至关重要的。

谢谢你, 斯蒂芬

1 个答案:

答案 0 :(得分:2)

您正在MQ Handler中调用WebService:

var client = new JsonServiceClient(...);
response = client.Post(m.GetBody());

因此,没有MQ响应仅在MQ服务中可用。虽然WebService将返回已发送的请求的响应,因此您可以在MQ请求上使用CorrelationId,否则您可以让Response DTO实现类似IHasCorrelationId的接口并以此方式实现,例如:

var correlationResponse = response as IHasCorrelationId;
if (correlationResponse != null)
{
    var correlationId = correlationResponse.CorrelationId;
}

创建自己的消息实例

如果您要创建自己的Message<T>is just a POCO,则可以初始化您自己的实例:

var mqResponse = new Message<Response>(response);

如果您只有运行时后期绑定类型信息,则可以使用以下命令创建一个:

var mqResponse = MessageFactory.Create(response);

使用RabbitMQ Message Filters

如果您只想记录传入和传出消息,可以使用RabbitMQ Message Filters,例如:

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