2016-09-15 54 views
1

我想找到在NServiceBus 5.x设计一个传奇由2个或更多的消息启动的帮助。这意味着传奇不会从一条消息开始,但所有消息都必须在传奇开始前出现。如何设计一个NServiceBus传奇开始收到多条消息

我不太明白这是如何工作的,并且没有任何样品或例子可以在任何地方找到。

我读了几本书,清楚地表明通过几条消息开始传奇是完美的。

我没有得到的是当你需要时,如何找到传奇。 3条消息来启动传奇。所有3条消息必须以任何顺序到达,然后才能“开始”。 这是如何影响我对[Unique]属性的选择?

例子:我需要的传奇是“独一无二”的三个ID“STOREID”立法院认定,“ComputerID”,“用户名”。这三个ID将到达三个不同的命令,Message1Message2,Message3

public class MySaga : Saga<MySagaData>, 
IAmStartedByMessages<Message1>, 
IAmStartedByMessages<Message2>, 
IAmStartedByMessages<Message3> 
{ ... 
} 

MySagaData应该在三个属性上有[Unique]属性吗?

public class MySagaData 
{ 
    [Unique] 
    public int StoreId {get;set;} 
    [Unique] 
    public int ComputerId {get;set;} 
    [Unique] 
    public int UserId {get;set;} 
} 

或者我必须创建只读属性连接这三个?

Message1Message3到达时,传奇无法启动。 Message2已丢失。

然后另一个Message1到达。

然后Message2到达。 (完成第一个传奇,所以它可以开始)

第二个Message1呢?

这将如何处理?

+0

就我所知,没有什么特别的内容可以支持这一点。 *任何*邮件到达时,您的传奇必须开始。然后,您可以对其他消息作出反应,以建立“完整”数据集,确定消息是相关的,等等。 –

+0

您使用哪种数据持久性? –

+0

@ColinPear Nhibernate – John

回答

1

萨加斯不支持你描述的模式。 IAmStartedByMessages指令适用于ANY,而不是ALL,语义。

一般来说,你有两种选择;

  1. 所要求的消息之一开始你的传奇实例,然后只是处理别人的到来,当他们被发送,或
  2. 实现你的传奇之前的一些点Aggregator模式被称为,这显然会消除等待多条消息的要求。
+0

谢谢汤姆。两个选项都是可行的,但是我现在所做的只是使用StoreID启动传奇1。然后使用StoreID + ComputerID从佐贺1内启动佐贺2。然后使用StoreID + ComputerID + UserID从那里开始传奇3。这有点像3传奇的嵌套。因此,一个带有StoreID + COmputerID的消息将会发现Saga 2,而不是Saga 1或3.这是一种有效的方法吗? – John

+0

@John - 它非常优雅。很难预测它是否会导致任何问题,但您只能尝试并找出答案。 –

0

这听起来像我开始传奇的行为是一个传奇。如果你创建了一个传奇来管理邮件的收集,然后启动另一个邮件来做任何正在等待这些邮件到来的工作。

3

收到的Saga实现处理的每条消息都只属于该Saga的一个实例。这3条消息中的每条消息都需要一些方法将它们关联到同一个Saga实例。

我会重新看看您的过程,看看它是如何将这三个实体的任意三种组合绑定在一起,以找到唯一标识佐贺的东西,例如,订购。

在此之后,您的佐贺可以等待,直到它收到所有3条消息,开始做任何你想做的事情,通过检查所有这三个ID是在做任何事情之前设置佐贺需要做的。

+0

像Bob提到的那样,您需要在三条消息之间进行关联。 – janovesk

相关问题