Опубликовать сообщение в EventHub Rider из MassTransit BehaviorContext

В документации для MassTransit Event Hub Riders рекомендуется использовать IEventHubProducerProvider (часть пакет MassTransit.EventHub nuget) для отправки сообщений в EventHub. Однако большая часть документации MassTransit предполагает, что при публикации сообщения от потребителя сообщений разработчик должен использовать ближайший экземпляр конечной точки публикации для публикации сообщения. В моем приложении я хочу разместить один и тот же MassTransitStateMachine в двух разных контекстах:

  1. Если он использует шину в памяти, и все сообщения между ним и другими производителями и потребителями являются частью одного и того же процесса.
  2. Где он использует райдер Event Hub для получения и публикации сообщений.

На мой взгляд, самая чистая реализация этого могла бы отложить всю конфигурацию того, где опубликованное сообщение попадает в конфигурацию шины, и вообще не зависеть от MassTransit.EventHub в потребителях сообщений. Это заставило меня задать вопрос, могу ли я публиковать сообщения с помощью ConsumeContext и сообщение попало в EventHub? Или я должен полагаться на IEventHubProducerProvider (или, может быть, предоставить свою собственную реализацию этого в памяти, которая использует ConsumeContext под капотом?)

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


person user483679    schedule 18.01.2021    source источник


Ответы (1)


Если вы отправляете сообщения в концентратор событий из конечного автомата, можно использовать Produce методы расширения. Они имеют ту же сигнатуру, что и методы расширения PublishAsync, но направляют сообщения в концентратор событий.

Например (взято из модульных тестов):

Initially(
    When(Started)
        .Then(context => context.Instance.Key = context.Data.TestKey)
        .Produce(x => Configuration.EventHubName, x => x.Init<EventHubMessage>(new {Text = $"Key: {x.Data.TestKey}"}))
        .TransitionTo(Active));
person Chris Patterson    schedule 18.01.2021
comment
Я не знал о методах расширения Produce! Они кажутся близкими или, может быть, именно тем, что я хочу. Если я зарегистрирую один и тот же MassTransitStateMachine в другом приложении, в котором не определен EventHub Rider (то есть все производители / потребители подключаются к одной и той же шине в памяти на том же компьютере, транспорт, который не определяет концепцию EventHubName, также известного как название темы ), вызывает ли такой вызов Produce просто отправку сообщения по шине или это вызовет другие проблемы? - person user483679; 18.01.2021
comment
Если нет производителя концентратора событий, это, скорее всего, вызовет проблемы. Если вы хотите это сделать, вам, скорее всего, придется заглушить объекты концентратора событий, необходимые, чтобы избежать исключений, когда нет райдера концентратора событий. - person Chris Patterson; 18.01.2021
comment
Если присмотреться, кажется, что Produce методы зависят от EventActivityBinder, а не от BehaviorContext, доступных в пользовательских действиях. Существует небольшая логика с отслеживанием состояния (для каждого значения в списке в состоянии экземпляра Saga отправьте копию полученного сообщения с correlationId, установленным на текущее значение итерации), которую эта служба должна реализовать, и, похоже, нет способ перебрать коллекцию состояний экземпляра саги и произвести для каждого из них в Automatonymous. Можно ли Produce как-нибудь использовать с BehaviorContext? - person user483679; 19.01.2021
comment
В этом случае вам нужно будет создать собственное действие для конечного автомата с зависимостью от производителя и поместить свою логику в это действие. Существует множество примеров действий конечного автомата, вы даже можете посмотреть фактический производить действия - person Chris Patterson; 19.01.2021
comment
Спасибо ... вот на что я приземлился. Я создал абстрактное сообщение для издателя тематических событий с различными реализациями (один для транспорта EventHub и один для хранения в памяти), а затем создал настраиваемое действие с зависимостью от абстрактного публикатора событий. Действие может проверять абстрагированный публикатор событий и принимать решение о размещении своего сообщения в нем или в собственном методе публикации BehaviorContext действия (транспорт в памяти, другие каналы, не являющиеся участниками, для публикации сообщений). - person user483679; 19.01.2021