1

语境

我有一个 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 中等待,直到任何时候。什么都没有丢失,只是延迟了一段不确定的时间。

此刻,唯一能想到的事情是:

  1. 我在本地使用 IIS Express,而服务器使用的是 IIS。
  2. Application_Start 需要在它可以处理消息之前发生。

我尝试通过在消息排队前后通过 HTTP 进行其他 API 调用来初始化服务,但失败多于成功。有时服务开始处理它们,但我无法识别并因此影响何时发生这种情况。

笔记

我确实有几个其他控制台应用程序和 Windows 服务,它们侦听其他 MQ 并处理其他应用程序放置的消息,并且这些服务始终完美无缺。不过,这是我第一次在现有的 Web 服务中尝试这样做。

4

1 回答 1

1

很难从这个描述中知道什么问题(消息丢失还是只是延迟?)但这听起来像是由于 ASP.NET AppDomain 回收,在这种情况下,您可以禁用 AppDomain 回收或设置连续 ping 路由来访问您的 ASP .NET Web 应用程序以保持 AppDomain 活动。

如果 ASP.NET 服务在 Internet 上可用,您可以使用https://uptimerobot.comhttps://www.pingdom.com等服务将其配置为以不同的时间间隔(例如 5-10 分钟) ping 您的服务否则,如果这是内部服务,您可以使用计划任务。

于 2015-03-26T19:44:18.307 回答