2016-09-15 5 views
1

Я пытаюсь найти помощь по разработке Saga в NServiceBus 5.x, который запускается двумя или более сообщениями. Это означает, что сага не начинается с одного сообщения, но все сообщения должны присутствовать до начала саги.Как создать саббу NServiceBus, начатую с получения нескольких сообщений

Я не совсем понимаю, как это будет работать, и нет никаких примеров или примеров, которые можно найти где угодно.

Я прочитал пару книг, в которых четко сказано, что это прекрасно, когда сага началась несколькими сообщениями.

То, что я не получаю, - это то, как сага будет найдена, когда вам нужно, например. 3 сообщения, чтобы начать сагу. Все 3 сообщения должны прибыть в любом порядке до того, как сага «начнет». Как это влияет на мой выбор атрибута [Unique]?

Пример: мне нужна сага, который является "уникальным" LY определены три ИД "StoreID", "ComputerID", "Идентификатор_пользователь". Эти три идентификатора будут поступать в три различные команды: Message1, Message2, 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;} 
} 

Или мне нужно создать свойство readonly, связанное с этими тремя?

Когда Message1 и Message3 прибывают, сага не может быть запущена. Message2 отсутствует.

Затем прибывает еще Message1.

Затем прибывает Message2. (завершение первой саги, поэтому ее можно запустить)

Как насчет второго Message1?

Как это будет обрабатываться?

+0

Нет ничего, специально созданного для поддержки этого, насколько я знаю. Ваша сага должна начинаться при появлении * любых сообщений. Тогда вам нужно реагировать на другие сообщения, поступающие для создания вашего «полного» набора данных, определить, что сообщения связаны и т. Д. –

+0

Какое постоянство данных вы используете? –

+0

@ColinPear Nhibernate – John

ответ

1

Саги не поддерживают узор, который вы описываете. Директивы IAmStartedByMessages применяются с ЛЮБОЙ, а не ВСЕ, семантикой.

В целом у вас есть два варианта;

  1. начать свой экземпляр сагу с одним из необходимых сообщений, а затем просто обрабатывать приход других, как и когда они будут отправлены, или
  2. реализовать Aggregator образец в какой-то момент перед вашей саги называется, которая очевидно, устранит необходимость ждать нескольких сообщений.
+0

спасибо Том. Оба варианта жизнеспособны, однако то, что я сделал сейчас, это начать сагу 1 только с помощью StoreID. Затем запустите Saga 2 из Saga 1 с помощью StoreID + ComputerID. Затем запустите сагу 3, используя StoreID + ComputerID + UserID. Это несколько гнездо 3 саг. Таким образом, сообщение с StoreID + COmputerID в нем найдет Saga 2, а не Saga 1 или 3. Это правильный подход? – John

+0

@John - это очень элегантно. Трудно предсказать, приведет ли это к каким-либо проблемам, но вы можете только попытаться выяснить. –

0

Мне кажется, что акт начала саги - это сага. Что делать, если вы создали сагу для управления коллекцией сообщений, а затем запустили другую, чтобы выполнить любую работу до получения этих сообщений.

3

Каждое сообщение, полученное вашей реализацией Saga, будет принадлежать только одному экземпляру этой Саги. Вам все равно потребуется какой-то способ в каждом из этих 3 сообщений, чтобы соотнести их с тем же экземпляром Saga.

Я бы пересмотрел ваш процесс и посмотрел, что это такое, что связывает любые три комбинации этих трех сущностей, чтобы найти то, что однозначно идентифицирует сагу, например. Порядок.

После этого ваша сага может просто подождать, пока она не получит все 3 сообщения, чтобы начать делать то, что вы хотите сделать, проверив, что все три этих идентификатора установлены, прежде чем делать то, что нужно сделать саге.

+0

Как упоминает Боб, вам потребуется что-то, что можно было бы связать с тремя сообщениями. – janovesk