语境
我有一个 RedisMqServer 配置为处理我的 ServiceStack Web 服务上的单个消息。该 MQ 上的消息来自另一个应用程序,并以所有正确的属性显示在 .inq 中。一切都在 4.0.38 上。
我在 MyAppHost.cs 中的配置:
public override void Configure(Container container)
{
var redisFactory = new PooledRedisClientManager(0, "etc:etc");
redisFactory.ConnectTimeout = 5;
redisFactory.IdleTimeOutSecs = 30;
redisFactory.PoolTimeout = 3;
container.Register<IRedisClientsManager>(redisFactory);
//Plugins, Filters, other Registrations omitted
var mqHost = new RedisMqServer(redisFactory, retryCount: 2);
mqHost.DisablePublishingResponses = true;
mqHost.RegisterHandler<CreateVisitor>(ServiceController.ExecuteMessage);
mqHost.Start();
}
然后在 Global.asax.cs 中:
void Application_Start(object sender, EventArgs e)
{
new MyAppHost().Init();
}
问题
当我将其部署到其他地方时,这些消息并没有得到一致的处理。他们在 .inq 中等待,直到任何时候。什么都没有丢失,只是延迟了一段不确定的时间。
此刻,唯一能想到的事情是:
- 我在本地使用 IIS Express,而服务器使用的是 IIS。
- Application_Start 需要在它可以处理消息之前发生。
我尝试通过在消息排队前后通过 HTTP 进行其他 API 调用来初始化服务,但失败多于成功。有时服务开始处理它们,但我无法识别并因此影响何时发生这种情况。
笔记
我确实有几个其他控制台应用程序和 Windows 服务,它们侦听其他 MQ 并处理其他应用程序放置的消息,并且这些服务始终完美无缺。不过,这是我第一次在现有的 Web 服务中尝试这样做。