Единица работы при использовании MassTransit - PullRequest
4 голосов
/ 06 апреля 2011

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

В NServiceBus я использовал бы интерфейс IMessageModule для подключения.похоже на это?На самом деле избавление от обработчика также сделало бы это, но поскольку я использую StructureMap в качестве ObjectBuilder, метод Release просто ничего не делает.

Ответы [ 2 ]

11 голосов
/ 06 апреля 2011

Вы можете зарегистрировать перехватчик для вызова до и после использования каждого сообщения. Как пример:

        LocalBus = ServiceBusConfigurator.New(x =>
            {
                x.ReceiveFrom("loopback://localhost/mt_client");

                x.BeforeConsumingMessage(() => { _before.Set(); });
                x.AfterConsumingMessage(() => { _after.Set(); });
            });

Посмотрите файл MessageInterceptor_Specs.cs в проекте MassTransit.Tests для проверки работоспособности модуля.

1 голос
/ 23 декабря 2013

Я прошел через тот же вызов, и вот как я это сделал.У нас был IUnitOfWork и ITransaction: с Commit () и Rollback () мы добавили класс для TransactionalOperation: ITransaction, чтобы добавить поддержку транзакционного поведения для не-db вещей.IUnitOfWork.Commit () перебирает список TransactionalOperations, которые могли бы быть добавлены к нему.

Теперь, чтобы связать шину с нашей системой: Добавлен IBus для обертывания внешней шины. Реализован MassTransitBusGateway: IBus, чтобы связатьшина к единице работы: Реализовано UnitOfWorkBus: IBus (декоратор) - этот декоратор делает любые вызовы Publish (), чтобы узнать о единице работы и добавить ее как TransactionalOperation, так что его выполнение задерживается до UnitOfWork.Commit ()

Таким образом, мы абстрагируем конкретную шину, избегая, таким образом, добавления зависимостей MassTransit для нескольких проектов (это действительно нужно только клиентам) и добавления поведения транзакций к его операциям.

...