Как отложить событие в NServiceBus 6.0?

Мы используем NserviceBus в качестве нашей инфраструктуры обмена сообщениями с RabbitMQ в качестве транспорта. Я пытаюсь перейти на NServiceBus 6.0 с версии 5.*. В версии 5.0 мы могли откладывать события с помощью Bus.Defer(). Но вроде как в 6.0 мы можем откладывать только сообщения но не события??

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

        var sendOptions = new SendOptions();
        sendOptions.DoNotDeliverBefore(DateTimeOffset.Now.AddMinutes(30));
        sendOptions.RouteToThisEndpoint();
        return context.Send(message, sendOptions);

но метод context.Publish(message, new PublishOptions()) принимает "PublishOptions", который не имеет возможности отложить.

Я что-то упустил здесь? Цените, если кто-то может помочь.


person Naren    schedule 20.09.2017    source источник
comment
Событие основано на том, что уже произошло, а не на действии, которое нужно отложить. Если вам нужно отсрочить действие, то, возможно, это должна быть команда? Без более широкого охвата проблемы трудно сказать. Можете ли вы добавить некоторые детали того, что вы делаете с точки зрения процесса?   -  person Sean Feldman    schedule 20.09.2017
comment
Существует система Product Authoring, которая публикует события при изменении данных о продукте. мы являемся подписчиком, и нам придется обновлять нашу систему при изменении данных о продукте. Некоторые изменения вступают в силу не сразу, поэтому нам придется отложить некоторые из этих событий. Например, событие может выглядеть так. ‹ProductDataUpdated› ‹EffectiveDate›22.09.2017‹/EffectiveDate› ‹/ProductDataUpdated› Тот факт, что обновление продукта является событием, сообщением или командой, всегда вызывает споры, но я не могу изменить его на сообщение или команду, потому что это вызывает другие вопросы.   -  person Naren    schedule 20.09.2017


Ответы (2)


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

Издатель не должен быть ограничен кем-либо из подписчиков.

Правильно ли предположить, что система Product Authoring публикует ProductDataUpdate событий независимо от фактической даты вступления в силу? В таком случае вы уже уведомлены о принятом решении. Что вы, как подписчик, собираетесь с этим делать — это уже другой вопрос и сугубо внутренний.

Вы можете отправить команду, для обсуждения назовите ее UpdateProductCost, это будет отложенное сообщение, если EffectiveDate будет в будущем. В противном случае это немедленная команда.

person Sean Feldman    schedule 20.09.2017
comment
Я согласен с тобой, Шон, ты абсолютно прав. Я мог бы сделать это, когда позволит время, чтобы следовать лучшим практикам, применяемым NserviceBus. Но сейчас я ищу быструю альтернативу. Спасибо за ваши предложения. - person Naren; 20.09.2017

У меня есть ответ на другом форуме, и я думаю, что он наиболее актуален, поэтому публикую его здесь, чтобы он мог помочь кому-то в будущем. Спасибо Даниэлю Марбаху

https://groups.google.com/forum/#!topic/particularsoftware/ivy1wdsycT8

Bus.Defer в v5 внутренне всегда выполнял операцию отправки. Похоже, что отличие от v6 заключается в том, что он автоматически отключил лучшие практики обмена сообщениями. Вы можете добиться того же, позвонив

        var sendOptions = new SendOptions();
        sendOptions.DoNotDeliverBefore(DateTimeOffset.Now.AddMinutes(30));
        sendOptions.RouteToThisEndpoint();
        sendOptions.DoNotEnforceBestPractices();
        return context.Send(message, sendOptions);

https://docs.particular.net/nservicebus/messaging/best-practice-enforcement

person Naren    schedule 20.09.2017