如何配置Rebus以使主题基于处理程序'类型

时间:2016-03-15 14:30:42

标签: sql-server mongodb publish-subscribe rebus azure-servicebus-topics

我正在使用Rebus,我希望在段落&#34中引入CQRS Journey中描述的内容; 避免多次处理事件"但我不能搞清楚。

我将Rebus配置为使用SQL Server进行传输,将MongoDB用于订阅 Sagas 路由配置为 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();

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

有些事情似乎让你的问题感到困惑。

但我想你的基本问题是如何确保每个订阅者只处理一次消息。

答案很简单:为每个订阅者设置一个单独的端点 - 这意味着每个订阅者都有自己的输入队列,从中处理消息,以及将返回失败的消息。

然后,您可以根据需要在每个订户中拥有尽可能多的处理程序。将为每个传入消息执行所有兼容处理程序。

使用Rebus,每次调用Configure.With(...).(...).Start()都会为您提供一个单独的端点 - 所以在您的情况下,我建议您将订阅者端点创建包装在一个方法中,然后您可以像这样调用:

var event1Subscriber = CreateSubscriber("subscriber_event1");
event1Subscriber.Subscribe<Event1>().Wait();

var event2Subscriber = CreateSubscriber("subscriber_event2");
event2Subscriber.Subscribe<Event2>().Wait();

var event3Subscriber = CreateSubscriber("subscriber_event3");    
event3Subscriber.Subscribe<Event3>().Wait();

// ...

其中CreateSubscriber将是这样的:

public IBus CreateSubscriber(string queueName)
{
    return Configure.With(GetContainerAdapter())
        .Transport(t => t.UseMsmq(queueName))
        .Start();        
}