Вы не можете решить эту проблему без изменения саги и, возможно, сообщений, отправляемых клиентской системой.
Ваша проблема в том, что сага, вероятно, настроена на запуск при получении определенного типа сообщения, которое генерируется клиентским приложением каждый раз, когда пользователь вносит изменения в клиента.
Назовем это сообщение:
public class ClientTypedSomethingAboutCustomer
{
int CustomerId {get;set;}
...
}
Ваша сага будет настроена примерно так:
public class CustomerSaga : Saga<CustomerSagaData>, IAmStartedByMessages<ClientTypedSomethingAboutCustomer>
{
public override void ConfigureHowToFindSaga()
{
ConfigureMapping<ClientTypedSomethingAboutCustomer>
(message => message.CustomerId).ToSaga(saga => saga.CustomerId);
...
}
...
}
Это приводит к инициализации саги и установке значения идентификатора клиента в реализации IContainSagaData для каждого отдельного полученного клиентского сообщения.
Чтобы решить проблему инициализации новых саг в дальнейших сообщениях, вы можете создать другой тип сообщения, чтобы различать, когда кто-то начинает вводить что-то о покупателе, а затем вводит что-то еще о этот клиент.
Что-то типа:
public class ClientTypedSomethingElseAboutCustomer
{
int CustomerId {get;set;}
...
}
Тогда ваша сага будет выглядеть так:
public class CustomerSaga : Saga<CustomerSagaData>, IAmStartedByMessages<ClientTypedSomethingAboutCustomer>
,IHandleMessages<ClientTypedSomethingElseAboutCustomer>
{
public override void ConfigureHowToFindSaga()
{
ConfigureMapping<ClientTypedSomethingAboutCustomer>
(message => message.CustomerId).ToSaga(saga => saga.CustomerId);
ConfigureMapping<ClientTypedSomethingElseAboutCustomer>
(message => message.CustomerId).ToSaga(saga => saga.CustomerId);
}
...
}
Это гарантирует, что все сообщения о клиенте будут направляться в один экземпляр саги.
Можно добиться приблизительного поведения очереди, запустив NServiceBus в однопоточном режиме. Это может ограничить создание одновременных саг для клиента, но я не хотел бы полагаться на это.
person
tom redfern
schedule
04.01.2016