Asp.net mvc 4 Rebus是否支持web应用发布消息和订阅消息

Asp.net mvc 4 Rebus是否支持web应用发布消息和订阅消息,asp.net-mvc-4,rebus,Asp.net Mvc 4,Rebus,我是个新手。 我想问一个问题: 让web应用程序发布消息并订阅消息是一个好主意。Rebus是否支持此功能 我测试,但它不工作。当web应用启动时,它只处理一条消息(来自pubsubsample.websubscriber1.input队列) 顺便说一句,它在单向客户端模式下运行良好。(仅发送消息) 这是我的服务器模式代码段: public class CheckStatus : IHandleMessages<NewTradeRecorded> { readonly IBu

我是个新手。 我想问一个问题:

  • 让web应用程序发布消息并订阅消息是一个好主意。Rebus是否支持此功能 我测试,但它不工作。当web应用启动时,它只处理一条消息(来自pubsubsample.websubscriber1.input队列)

    顺便说一句,它在单向客户端模式下运行良好。(仅发送消息)

    这是我的服务器模式代码段:

     public class CheckStatus : IHandleMessages<NewTradeRecorded>
    {
        readonly IBus bus;
    
        public CheckStatus(IBus bus)
        {
            this.bus = bus;
        }
    
        public void Handle(NewTradeRecorded message)
        {
    
        }
     }
    
    公共类检查状态:IHandleMessages
    {
    只读IBus总线;
    公共检查状态(IBus总线)
    {
    这辆公共汽车=公共汽车;
    }
    公共无效句柄(新录制的消息)
    {
    }
    }
    
    Asp.NETMVC

    protected void Application_Start()
        {
    
            using (var adapter = new BuiltinContainerAdapter())
            {
                adapter.Register(() => new CheckStatus(adapter.Bus));
    
               Configure.With(adapter)
                       .Transport(t => t.UseMsmqAndGetInputQueueNameFromAppConfig())
                         .MessageOwnership(o => o.FromRebusConfigurationSection())
                         .CreateBus()
                         .Start();
    
               adapter.Bus.Subscribe<NewTradeRecorded>();
    
            }
        }
    
    受保护的无效应用程序\u Start()
    {
    使用(var适配器=新的内置容器适配器())
    {
    寄存器(()=>newcheckstatus(adapter.Bus));
    配置.With(适配器)
    .Transport(t=>t.UseMSqAndGetInputQueueNameFromAppConfig())
    .MessageOwnership(o=>o.fromReBusConfiguration节())
    .CreateBus()
    .Start();
    adapter.Bus.Subscribe();
    }
    }
    
    web.config

    <rebus  inputQueue="pubsubsample.websubscriber1.input" errorQueue="pubsubsample.websubscriber1.error" workers="1" maxRetries="5">
    <endpoints>
      <add messages="Trading.Messages" endpoint="trading.input"/>
    </endpoints>
    
    
    

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

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

    NET中的Web应用程序本质上是暂时的,也就是说,当IIS决定是回收的时候,它们被回收,然后订阅消息通常不是最好的主意,因为在发布事件时,您的应用程序可能没有运行,因此无法处理它

    然后,当它因为IIS向其发送web请求而被唤醒时,可能有1000000个事件等待应用程序处理,这将需要相当长的时间来仔细研究

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

    出于这些原因,通常我不推荐在web应用程序中执行发布/订阅

    那么,为什么你的酒吧/酒吧不管用?首先,不要在创建容器适配器之后立即处理它

    改为这样做:

    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());
    }
    
    static readonly\u stuffToDispose=new List();
    受保护的无效应用程序\u Start()
    {
    var适配器=新的内置容器适配器();
    _添加(适配器);
    寄存器(()=>newcheckstatus(adapter.Bus));
    配置.With(适配器)
    .Transport(t=>t.UseMSqAndGetInputQueueNameFromAppConfig())
    .MessageOwnership(o=>o.fromReBusConfiguration节())
    .CreateBus()
    .Start();
    adapter.Bus.Subscribe();
    }
    受保护的无效应用程序_End()
    {
    _ForEach(d=>d.Dispose());
    }
    

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

    要回答您的第一个问题,Rebus是否支持从同一进程发布和订阅消息,答案是肯定的-没有任何技术原因可以解释为什么您不能订阅消息并发布来自同一进程的相同消息,这包括您的web应用程序

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

    NET中的Web应用程序本质上是暂时的,也就是说,当IIS决定是回收的时候,它们被回收,然后订阅消息通常不是最好的主意,因为在发布事件时,您的应用程序可能没有运行,因此无法处理它

    然后,当它因为IIS向其发送web请求而被唤醒时,可能有1000000个事件等待应用程序处理,这将需要相当长的时间来仔细研究

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

    出于这些原因,通常我不推荐在web应用程序中执行发布/订阅

    那么,为什么你的酒吧/酒吧不管用?首先,不要在创建容器适配器之后立即处理它

    改为这样做:

    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());
    }
    
    static readonly\u stuffToDispose=new List();
    受保护的无效应用程序\u Start()
    {
    var适配器=新的内置容器适配器();
    _添加(适配器);
    寄存器(()=>newcheckstatus(adapter.Bus));
    配置.With(适配器)
    .Transport(t=>t.UseMSqAndGetInputQueueNameFromAppConfig())
    .MessageOwnership(o=>o.fromReBusConfiguration节())
    .CreateBus()
    .Start();
    adapter.Bus.Subscribe();
    }
    受保护的无效应用程序_End()
    {
    _ForEach(d=>d.Dispose());
    }
    

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

    要回答您的第一个问题,Rebus是否支持publishi