Não Rebus suporte do aplicativo web de publicação de mensagem de e assinando a mensagem
-
21-12-2019 - |
Pergunta
Eu sou novo para Rebus.Existem perguntas que eu quero perguntar:
- É 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>
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.