RebusはWeb App Publishingメッセージをサポートし、メッセージを購読する
-
21-12-2019 - |
質問
私は救済に新しいです。 私が尋ねたい質問が1つあります:
- Webアプリを公開してメッセージを購読することをお勧めします。そして、refusはこの機能をサポートしますか。
テストサーバーモードには機能しません。。Webアプリが起動すると、メッセージを1つだけ処理します(pubsubsample.websubscriber1.input Queueから)。
BTW、一方向クライアントモードでうまく機能します。(メッセージのみ)
これはサーバーモードのための私のコードセグメントです:
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>();
}
}
.
web.config
<rebus inputQueue="pubsubsample.websubscriber1.input" errorQueue="pubsubsample.websubscriber1.error" workers="1" maxRetries="5">
<endpoints>
<add messages="Trading.Messages" endpoint="trading.input"/>
</endpoints>
.
解決
あなたの最初の質問に答えるために、リバウスが同じプロセスから出版をサポートしているかどうか、答えはイエスです - メッセージを購読して同じメッセージを公開できない理由はありません。プロセス、そしてあなたのWebアプリケーションを含みます。
が別のものであるか:)
.NETのWebアプリケーションは、本質的に一種の一種です。つまり、IISがリサイクルする時期があると判断したときにリサイクルされています。これは通常、アプリケーションが実行されていない可能性があるためイベントが公開されているので、それを処理するのはそのままではありません。
目が覚めたときに、IISがWebリクエストを派遣するため、アプリケーションによって処理されるのを待っている1,000,000のイベントがある可能性があります。
Webアプリケーションでrevus pub / subを使用したいと思っている人は、Webアプリケーションでキャッシュを更新します - しかし、IISが2つのインスタンスの重複をサポートするという事実からの厳しい問題が発生しました。同じWebアプリケーション - IOWは、突然、短い間、同じWebアプリケーションの2つのインスタンスが実行されていたため、Webアプリケーションがシャットダウンしようとし、新しいインスタンスによって処理されるべきであるイベントをいくつかスナッチすることができます。< / P>
これらの理由から、一般に、私は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アプリが起動した直後にメッセージの処理を停止しません。