2015-05-29 1 views
1

Мне нужно измерить время вызова метода Handle в каждом случае интерфейса IHandleMessages <>. Я пытался использовать перехватчик замка Виндзор,Как измерить время вызова метода «Ручка» в NServiceBus?

public class NsbHandlerMeasurementInterceptor : IInterceptor 
{ 
    public void Intercept(IInvocation invocation) 
    { 
     if (invocation.Method.Name == ExpressionExtender.GetMethodName<IHandleMessages<DummyType>>(b => b.Handle(null))) 
     { 
      Stopwatch stopwatch = new Stopwatch(); 
      stopwatch.Start(); 

      invocation.Proceed(); 

      stopwatch.Stop(); 

      // save stopwatch.ElapsedMilliseconds value 
     } 
     else 
     { 
      invocation.Proceed(); 
     } 
    } 
} 

с кодом установки:

container.Register(Component.For<NsbHandlerMeasurementInterceptor>()); 
container.Kernel.ComponentModelBuilder.AddContributor(new NsbWindsorModelConstructionContributor()); 

public class NsbWindsorModelConstructionContributor : IContributeComponentModelConstruction 
{ 
    public void ProcessModel(global::Castle.MicroKernel.IKernel kernel, global::Castle.Core.ComponentModel model) 
    { 
     if (model.Services.Any(s => s.ImplementsGenericInterface(typeof(IHandleMessages<>)))) 
     { 
      model.Interceptors.AddIfNotInCollection(new InterceptorReference(typeof(NsbHandlerMeasurementInterceptor)));  
     } 
    } 
} 

но от этого метода момент ручки не стреляя.

Я знаю о счетчиках производительности в NSB, но мне нужны более конкретные, ориентированные на тип измерения. Возможно ли это и достижимо?

ответ

2

Чтобы измерить все, есть счетчик производительности, но если этого недостаточно, вы можете создать свой собственный шаг в конвейере NServiceBus.

http://docs.particular.net/nservicebus/pipeline/customizing

Создать собственное поведение наследуя IBehavior<IncomingContext> и реализовать интерфейс. Теперь у вас есть доступ к аргументу IncomingContext, который содержит информацию о типах.

Ознакомьтесь с реализацией поведения InvokeHandlersBehavior. Это поведение вызывает фактический обработчик и, вероятно, хочет его обернуть.

https://github.com/Particular/NServiceBus/blob/5.2.0/src/NServiceBus.Core/Unicast/Behaviors/InvokeHandlersBehavior.cs

class InvokeHandlersBehavior : IBehavior<IncomingContext> 
{ 
    public void Invoke(IncomingContext context, Action next) 
    { 
     ActiveSagaInstance saga; 

     if (context.TryGet(out saga) && saga.NotFound && saga.SagaType == context.MessageHandler.Instance.GetType()) 
     { 
      next(); 
      return; 
     } 

     var messageHandler = context.MessageHandler; 

     messageHandler.Invocation(messageHandler.Instance, context.IncomingLogicalMessage.Instance); 
     next(); 
    } 
} 

Затем нужно зарегистрировать его так, что он называется включенный в трубопровод.

class NewStepInPipeline : RegisterStep 
{ 
    public NewStepInPipeline() 
     : base("NewStepInPipeline", typeof(SampleBehavior), "Logs a warning when processing takes too long") 
    { 
     // Optional: Specify where it needs to be invoked in the pipeline, for example InsertBefore or InsertAfter 
     InsertBefore(WellKnownStep.InvokeHandlers); 
    } 
} 

class NewStepInPipelineRegistration : INeedInitialization 
{ 
    public void Customize(BusConfiguration busConfiguration) 
    { 
     // Register the new step in the pipeline 
     busConfiguration.Pipeline.Register<NewStepInPipeline>(); 
    } 
} 

Обратите внимание, что для этого кода требуется v5. Проверьте сайт технической документации на другие версии.

Смежные вопросы