2012-12-05 101 views
0

我想初始化一些記錄發來的郵件中是這樣的:如何在nservicebus中預處理消息?

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

回答

1

移動軌跡ID的頭而不是和使用工作(IManageUnitsOfWork)的單位與log4net的背景下

+0

我只是從Bus.CurrentMessageContext中抓取它嗎?這是線程安全的權利? – Micah

0

這裏註冊這是我如何解決它。我想自動創建跟蹤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; 
    } 
} 

IMutateIncomingMessagesIMutateOutgoingMessages接口允許我在挖掘到nservicebus的通訊管道。我在挖掘源代碼之後才發現它是爲了弄清楚底層實際發生了什麼。您需要在您的IoC容器中註冊該課程才能使其工作。

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

當消息發送'MutateOutgoing'將被調用。此時,我從log4net.ThreadContext中獲取當前跟蹤ID(如果有),並將其分配給消息。當收到消息時,調用MutateIncoming,然後爲該線程設置log4net.ThreadContext trace id屬性。

相關問題