有在卤面的几种解决方案:)
对于您的情况,我可以看到解决它的方法有两种:1)使用自定义主题,或2)实现真正的基于内容的路由器。
如果有意义的话,可以使用Rebus的主题API来模拟此发布/订阅方案,以关注路由。如果你可以说你的数据信息属于某个类别,那么你的用户就可以订阅,这是有道理的。
与基于主题的“真实”排队系统相比, RabbitMQ,Rebus中的主题API非常粗糙。它不允许使用通配符(*)或任何类似高级的主题 - 主题只是可以订阅的简单字符串,然后用作发布/订阅渠道以将事件路由到多个订阅者。
您可以在用户的最终使用它像这样:
await bus.Advanced.Topics.Subscribe("department_a");
,然后在出版商的结尾:
var data = new Data(...);
await bus.Advanced.Topics.Publish("department_a", data);
如果不剪,你可以插入一个“真正的“基于内容的路由器,它仅仅是一个端点,它将您的消息转发给相关用户。
它可以在两个级别与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有关的一些详细信息)
由于您很早就抛弃了'BuiltinHandlerActivator',所以您会得到'NullReferenceException',如果''Console.ReadLine();'存在for'''循环后面,您将会得到另一个错误, “subscriberA”队列不存在 – mookid8000
愚蠢的我。谢谢。 :) –
是:)你可以阅读关于它[在这里关于交易的维基页面](https://github.com/rebus-org/Rebus/wiki/Transactions) – mookid8000