1

话题,我要像在CQRS Journey在段落‘避免处理事件多次’描述来介绍一些东西,但我无法弄清楚。如何配置卤面有我使用卤面根据处理程序类型

我配置卤面使用SQL Server的运输和MongoDB的订阅英雄传奇路由配置为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(); 

现在我应该的方式配置卤面,当命令发布的事件,这是因为许多独立的主题(虚拟或物理队列),为现有用户类型的复制。

喜欢的东西:

bus.Subscribe<Assembly1.EventHandler1>("Assembly1.EventHandler1Queue").Wait(); 
bus.Subscribe<Assembly1.EventHandler2>("Assembly1.EventHandler2Queue").Wait(); 
bus.Subscribe<Assembly2.EventHandler1>("Assembly2.EventHandler1Queue").Wait(); 

感谢您的帮助。

+0

您所标记的问题与'蔚servicebus-topics'和你引用有关如何使用的文章(除其他事项外)Azure的服务总线的主题来实现的酒吧/分....但你有骗局想你的公交车使用SQL Server作为其消息队列 - 这是故意的吗? – mookid8000

+0

我刚刚添加了该标记,因为我无法将“主题/主题”作为新标记插入 – ilcorvo

回答

1

有这似乎与你的问题令人困惑的几件事情。

但我猜你的基本问题是如何确保每条消息只能由每个用户处理一次。

答案很简单:让每个用户一个单独的终点 - 这意味着每个用户都会有哪些消息得到来自处理自己的输入队列,其中失败的消息将返回。

,只要你想你就可以有尽可能多或尽可能少的处理程序中各个订户。所有兼容的处理程序将针对每个传入消息执行。

随着卤面,每次调用​​会给你一个单独的终结点 - 所以你的情况,我建议你换一个方法,然后你就可以调用这样的订户端点创建:

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

尽管存在令人困惑的问题,但您确实明白了这一点。问题是:我无法弄清楚如何用Rebus做到这一点。请问,请添加一个特定的代码示例? – ilcorvo

+0

我失去了什么,其实,是如何创造“为每个用户一个单独的终点”。 – ilcorvo

+0

我已经添加了一些代码来举例说明我的意思:) – mookid8000