我目前正在尝试使用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
处理程序更方便。
答案 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));