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 回答