Там в нескольких решений в Rebus :)
Для вашего сценария, я вижу два пути ее решения: 1) Использование пользовательских тем, или 2) Реализовать реальный маршрутизатор на основе контента.
Если это имеет смысл, вы можете смоделировать этот сценарий pub/sub, используя темы, используя API-интерфейс Rebus, чтобы заботиться о маршрутизации. Это имеет смысл, если вы можете сказать, что ваши сообщения данных относятся к какой-то категории, которую подписчики могут подписывать.
По сравнению с «настоящими» системами массового обслуживания на основе тем, например, RabbitMQ, API тем в Rebus очень груб. Это не позволяет использовать подстановочные знаки (*) или что-то подобное - темы - это просто строки, которые вы можете подписаться, а затем использовать в качестве паба/подканала для передачи события нескольким подписчикам.
Вы можете использовать его, как это в конце абонента:
await bus.Advanced.Topics.Subscribe("department_a");
, а затем в конце издателя:
var data = new Data(...);
await bus.Advanced.Topics.Publish("department_a", data);
Если это не режет его, вы можете вставить «реальный «основанный на контенте маршрутизатор, который является просто конечной точкой, которой вы пользуетесь await bus.Send(eachDataMessage)
, которая, в свою очередь, направляет сообщение соответствующим подписчикам.
Это может быть сделано на двух уровнях с помощью Rebus, в зависимости от ваших требований. Если этого достаточно, чтобы посмотреть на заголовках сообщения, вы должны реализовать его в качестве «транспортного сообщения экспедитора», потому что скачет десериализацию и обеспечивает хороший API для просто пересылок сообщений:
Configure.With(...)
.Transport(t => t.UseMsmq("router"))
.Routing(r => {
r.AddTransportMessageForwarder(async transportMessage => {
var headers = transportMessage.Headers;
var subscribers = Decide(headers);
return ForwardAction.ForwardTo(subscribers);
});
})
.Start();
Если вам нужно смотреть на фактическое сообщение, вы должны просто реализовать обычный обработчик сообщений, а затем использовать автобус, чтобы переслать сообщение:
public class Router : IHandleMessages<Data>
{
readonly IBus _bus;
public Router(IBus bus)
{
_bus = bus;
}
public async Task Handle(Data message)
{
var subscribers = Decide(message);
foreach(var subscriber in subscribers)
{
await _bus.Advanced.TransportMessage.ForwardTo(subscriber);
}
}
}
обычай Реализуемый маршрутизатор является наиболее гибким решением, так как вы можете реализовать любую логику вам нравится, но как вы можете видеть, это немного более активно.
(*) Ребус не позволяет использовать групповые символы в целом, хотя ли проходят темы непосредственно RabbitMQ, если вам случится использовать, что в качестве транспорта, а это значит, что вы можете взять полное преимущество RabbitMQ (см this issue для получения более подробной информации о какой-то)
Вы получаете 'NullReferenceException', потому что вы слишком рано устанавливаете' BuiltinHandlerActivator' - если вы 'Console.ReadLine();' сразу после существования 'for'-loop, вы получите еще одну ошибку, указав, что очереди 'абонентА' не существует – mookid8000
Глупый я. Благодарю. :) –
да :) вы можете прочитать об этом [здесь, на странице вики об операциях] (https://github.com/rebus-org/Rebus/wiki/Transactions) – mookid8000