给出这段代码:
//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查询此表以进行故障排除是至关重要的。
谢谢你, 斯蒂芬
答案 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,例如:
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;
}
};