私は Rebus を使用しており、CQRS Journeyの段落「イベントを複数回処理するのを避ける」のようなものを導入したいのですが、わかりません。
トランスポートには SQL Server を使用し、サブスクリプションとサガには MongoDBを使用するように Rebus を構成しました。RoutingはTypeBasedで構成され、すべてのコマンド ハンドラーの型をTransportで構成されたキューにマップします。
var bus = Configure.With(new SimpleInjectorContainerAdapter(container))
.Logging(l => l.Trace())
.Transport(t =>
{
t.UseSqlServer(connectionstring, "TestMessages", "messageQueueName");
})
.Routing(r => r.TypeBased()
.MapAssemblyOf<Assembly1.Commands.DoSomething>("messageQueueName")
.MapAssemblyOf<Assembly2.Commands.DoSomethingElse>("messageQueueName")
)
.Sagas(s => s.StoreInMongoDb(db, (sagaType) =>
{
return sagaType.Name;
}))
.Subscriptions(s => s.StoreInMongoDb(db, "Subscriptions"))
.Options(o =>
{
o.SetNumberOfWorkers(1);
o.SetMaxParallelism(1);
o.EnableSagaAuditing().StoreInMongoDb(db, "Snapshots");
})
.Start();
ここで、コマンドがイベントを発行するときに、これが既存のサブスクライバーのタイプと同じ数の個別のトピック (仮想または物理キュー) にレプリケートされるように Rebus を構成する必要があります。
何かのようなもの:
bus.Subscribe<Assembly1.EventHandler1>("Assembly1.EventHandler1Queue").Wait();
bus.Subscribe<Assembly1.EventHandler2>("Assembly1.EventHandler2Queue").Wait();
bus.Subscribe<Assembly2.EventHandler1>("Assembly2.EventHandler1Queue").Wait();
手伝ってくれてありがとう。