ServiceStack消息队列处理和Profiler

时间:2014-01-19 16:26:49

标签: servicestack servicestack.redis

我目前正在尝试使用ServiceStack的持久性迷你探查器功能,我目前无法为Redis Message Queue处理程序注册配置文件信息。

更多背景: 我有一些常规的REST api处理程序,它接受请求,推迟一些帐户信息的更新,并回复确定回调用者。这些消息使用ServiceStack Redis MQ pattern发布到Redis服务器。因此,Redis消息处理注册为:

var redisFactory = new PooledRedisClientManager(redisClients);
var mqHost = new RedisMqServer(redisFactory, retryCount: 2);

var defaultThreadCount = 4;
mqHost.RegisterHandler<SomeDto>(m => this.ServiceController.ExecuteMessage(m), noOfThreads:defaultThreadCount);
mqHost.RegisterHandler<SomeOtherDto>(m => this.ServiceController.ExecuteMessage(m), noOfThreads:defaultThreadCount);
mqHost.Start();    

我的信息也得到了妥善处理。

custom ServiceRunner我已启用BeforeEachRequest中所有请求的分析,并添加了这样的自定义Profiler步骤:

public override void BeforeEachRequest(IRequest requestContext, T request)
{
    Profiler.Start();

    using (Profiler.StepStatic("Executing handler"))
    {
        base.BeforeEachRequest(requestContext, request);        
    }
 }

我的所有HTTP REST请求都会进入SQL表,但是MQ处理程序调用的 none 已注册。而且我100%确信处理程序确实正在执行,因为执行的结果存储在MongoDB集合中。

我缺少什么?

- 编辑 -

我忘了提到这个项目确实是通过ASP.NET应用程序托管的。 AppHost在Global.asax App_Start中初始化 - 我发现在“请求之前”处理自定义服务运行器而不是ASP.NET Begin_Request处理程序更方便。

2 个答案:

答案 0 :(得分:4)

我遇到了与自托管服务器类似的问题。问题是探查器使用HttpContext.Current来存储分析结果。如果没有有效的上下文,则不知道将结果添加到哪个概要文件“会话”。

可以通过设置Profile.Settings.ProfilingProvider来实现自己的ProfilingProvider,但是,除非我遗漏了某些东西,否则在使用当前IProfilerProvider接口的Async环境中正确实现它将是棘手的(如果不是不可能的话)。

答案 1 :(得分:3)

我写了一个very simple and naive provider,你可以用它进行分析。这不会选择ServiceStack默认添加的任何步骤,但它可能对您自己的调试仍然有用。

使用示例:

Profiler.Settings.ProfilerProvider = RequestProfilerProvider.Instance;
PreRequestFilters.Add((req, res) => RequestProfiler.Start(req));
GlobalRequestFilters.Add((req, res, dto) => {
  var profiler = RequestProfiler.GetProfiler(req);
  using (profiler.Step("Very slow step")) {
    Thread.Sleep(1000);
  }
});
GlobalResponseFilters.Add((req, res, dto) => RequestProfiler.Stop(req));