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

IMutateIncomingMessagesインターフェイスとインターフェイスを使用するIMutateOutgoingMessagesと、nservicebus のメッセージング パイプラインを利用できます。ソースコードを掘り下げて、内部で実際に何が起こっているのかを突き止めた後、私はそれを発見しました. このクラスを機能させるには、IoC コンテナーにこのクラスを登録する必要があります。

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

メッセージが送信されると、「MutateOutgoing」が呼び出されます。その時点で、存在するlog4net.ThreadContext場合は現在のトレース ID を取得し、それをメッセージに割り当てます。メッセージが受信MutateIncomingされると が呼び出され、log4net.ThreadContextそのスレッドのトレース ID プロパティを設定します。

于 2012-12-06T16:45:46.957 に答える