0

当这样的消息进来时,我想初始化一些日志记录:

public class BaseMessage
{
    public long TraceID { get; set; }
}

public class MyMessage : BaseMessage, ICommand
{
    //..other properties
}

public class Handler : IHandleMessages<MyMessage>
{
    public void Handle(MyMessage message)
    {
        log4net.ThreadContext.Properties["TraceID"] = message.TraceID

        //Process message
    }
}

问题是我有很多消息,我想在收到消息时为所有消息都这样做。我希望能够做这样的事情:

public class Handler : IInitializeHandlers, IHandleMessages<MyMessage>
{
    public void Init(BaseMessage message)
    {
        log4net.ThreadContext.Properties["TraceID"] = ((BaseMessage)message).TraceID
    }


    public void Handle(MyMessage message)
    {
        //Process message
    }
}
4

2 回答 2

1

将跟踪 ID 移动到标头,并使用工作单元 (IManageUnitsOfWork) 将其注册到 log4net 上下文

于 2012-12-05T17:51:17.283 回答
0

这是我解决它的方法。我想自动创建 Trace ID 并将其发送到消息正文而不是标题中。我不确定将标头添加到总线的线程安全性,并且我不想更改所有调用代码或修改任何 IHandleMessages 实现。所以这就是我想出的。

public class TraceIDMutator : IMutateIncomingMessages, IMutateOutgoingMessages
{
    public object MutateIncoming(object message)
    {
        var baseMsg = message as MessageBase;
        if (baseMsg != null)
            ThreadContext.Properties[Constants.TraceID] = baseMsg.TraceID;

        return message;
    }

    public object MutateOutgoing(object message)
    {
        var baseMsg = message as MessageBase;
        if(baseMsg != null)
        {
            if(baseMsg.TraceID == 0)
            {
                 var tid = ThreadContext.Properties[Constants.TraceID];
                 if (tid != null)
                     baseMsg.TraceID = (ulong)tid;
            }
        }

        return message;
    }
}

和接口允许我接入 nservicebus 的消息传递管道IMutateIncomingMessagesIMutateOutgoingMessages我只是在挖掘源代码以弄清楚引擎盖下到底发生了什么之后才发现它。您需要在您的 IoC 容器中注册此类才能使其工作。

        ObjectFactory.Configure(x =>
        {
            x.For<IMutateIncomingMessages>().Use<TraceIDMutator>();
            x.For<IMutateOutgoingMessages>().Use<TraceIDMutator>();
        });

发送消息时将调用“MutateOutgoing”。那时,我从log4net.ThreadContextif 中获取当前跟踪 id 并将其分配给消息。收到消息后,MutateIncoming将调用它,然后我log4net.ThreadContext为该线程设置跟踪 id 属性。

于 2012-12-06T16:45:46.957 回答