Não Rebus suporte do aplicativo web de publicação de mensagem de e assinando a mensagem

StackOverflow https://stackoverflow.com//questions/21010635

  •  21-12-2019
  •  | 
  •  

Pergunta

Eu sou novo para Rebus.Existem perguntas que eu quero perguntar:

  1. É uma boa idéia para tornar o web app publicar mensagem e de assinar a mensagem.E não Rebus suporte esta funcionalidade.

Eu teste Modo de servidor de no entanto , ele não funciona.Ele manipula a mensagem apenas uma mensagem(de pubsubsample.websubscriber1.fila de entrada) quando o web app é iniciado.

BTW,Ele funciona bem em Um caminho modo de cliente.(Enviar mensagem)

Aqui é o meu segmento de código para o modo de servidor de:

 public class CheckStatus : IHandleMessages<NewTradeRecorded>
{
    readonly IBus bus;

    public CheckStatus(IBus bus)
    {
        this.bus = bus;
    }

    public void Handle(NewTradeRecorded message)
    {

    }
 }

Asp.net MVC

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>();

        }
    }

da web.config

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

Foi útil?

Solução

Para responder a sua primeira pergunta, se Rebus suporte de publicação e subscrição do mesmo processo,, a resposta é sim - não há nenhuma razão técnica porque você não pode subscrever mensagens e publicar as mesmas mensagens a partir do mesmo processo, e que inclui o seu aplicativo da web.

Se você deve é outra coisa :)

Aplicativos Web .NET são uma espécie de natureza transitória, i.é.eles são reciclados quando o IIS decide que é hora de reciclar e, em seguida, ele normalmente não é a melhor idéia para assinar mensagens, porque o aplicativo não pode ser executado quando um evento é publicado, então não é em torno de lidar com isso.

E então, quando ele acorda porque o IIS distribui uma solicitação da web, você pode ter 1.000.000 de eventos de espera para ser processado pela sua aplicação, o que vai levar muito tempo para mastigar meio.

Em alguns casos, já ouvi falar de pessoas querendo usar Rebus pub/sub em aplicações web para manter um cache atualizados no web app, mas, em seguida, eles tiveram problemas graves, vindo do fato de que o IIS suporta a sobreposição de duas instâncias do mesmo aplicativo web - iow, de repente, por um curto período de tempo, duas instâncias do mesmo aplicativos da web estavam em execução, permitindo, assim, uma aplicação web prestes a encerrar para arrebatar alguns eventos que deveria ter sido tratada pela nova instância.

Por estas razões, em geral, eu iria não recomendável fazer pub/sub em aplicações web.

Assim, por que não o seu pub/sub coisa funciona?Bem - primeira coisa:Não destrua o container imediatamente após a sua criação!:)

Fazer isso:

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());
}

Desta forma, você ônibus não parar o tratamento de mensagens imediatamente após sua aplicação web foi iniciado.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top