0
4

1 回答 1

3

要回答您的第一个问题,Rebus 是否支持从同一进程发布和订阅,答案是肯定的 - 没有技术原因不能订阅消息并从同一进程发布相同的消息,这包括您的 Web 应用程序。

你是否应该是另一回事:)

.NET 中的 Web 应用程序本质上是一种瞬态,即当 IIS 决定是时候回收时它们会被回收,然后订阅消息通常不是最好的主意,因为当事件发生时您的应用程序可能不会运行已发布,因此无法处理它。

然后,当它因为 IIS 向其分派 Web 请求而唤醒时,您可能有 1,000,000 个事件等待您的应用程序处理,这需要相当长的时间来处理。

在某些情况下,我听说有人希望在 Web 应用程序中使用 Rebus pub/sub 来保持 Web 应用程序中的缓存更新 - 但后来他们遇到了严重的问题,因为 IIS 支持重叠两个相同的实例Web 应用程序 - 突然,有一段时间,同一 Web 应用程序的两个实例正在运行,因此允许一个即将关闭的 Web 应用程序来抢夺一些应该由新实例处理的事件。

由于这些原因,通常我建议在 Web 应用程序中进行发布/订阅。

那么,为什么您的 pub/sub 不起作用?好吧 - 第一件事:不要在创建容器适配器后立即处理它!:)

改为这样做:

static readonly _stuffToDispose = new List<IDisposable>();

protected void Application_Start()
{
    var adapter = new BuiltinContainerAdapter();

    _stuffToDispose.Add(adapter);

    adapter.Register(() => new CheckStatus(adapter.Bus));

    Configure.With(adapter)
             .Transport(t => t.UseMsmqAndGetInputQueueNameFromAppConfig())
             .MessageOwnership(o => o.FromRebusConfigurationSection())
             .CreateBus()
             .Start();

    adapter.Bus.Subscribe<NewTradeRecorded>();
}

protected void Application_End()
{
    _stuffToDispose.ForEach(d => d.Dispose());
}

这样,您的总线不会在您的 Web 应用程序启动后立即停止处理消息。

于 2014-01-09T06:18:46.340 回答