Rebus具有灵活的系统,允许我在web.config
或通过实施自定义IDetermineMessageOwnership
为不同的消息类型指定不同的端点。
据我所知,消息所有权仅由字符串表示。使用MSMQ传输,此字符串指向传递消息的队列。使用RabbitMQ时,该字符串将用作消息的主题,然后将其传递到名为“Rebus”的通用交换。 Rebus是一个很好的人,因此他还使用相同的名称在RabbitMQ服务器中设置队列,并在Rebus交换中从主题到队列进行绑定。
我的问题是:是否可以让Rebus 不创建队列和绑定,但是仍然将消息传递给具有针对每条消息的相关主题集的交换?
手动声明队列和绑定将允许我使用带有通配符的绑定设置一个非常棒的主题交换。这是一个很好的插图,主题交换与时髦的绑定,只是为了让我的问题看起来更光滑和性感:
答案 0 :(得分:3)
听起来像你想做这样的事情:
Configure.With(yourFavoriteContainer)
.Transport(t => t.UseRabbitMq(...)
.ManageSubscriptions()) //< BAM!!1
.(...)
让Rebus利用Rebus'RabbitMqMessageQueue
实现IMulticastTransport
这一事实,后者又将所有组播的处理转移到Rabbit。
重要的是,所有启用Rabbit的Rebus端点都同意让Rabbit ManageSubscriptions
- 否则,可能会发生奇怪的事情;)
这意味着
bus.Subscribe<SomeEvent>
时,将具有类型名称的主题绑定到订阅者的输入队列 - 例如"SomeEvent.SomeNamespace" -> myInputQueue
"SomeEvent.SomeNamespace"
如果您需要更大的灵活性,您甚至可以负责决定要为每种.NET类型发布的主题,如下所示:
Configure.With(yourFavoriteContainer)
.Transport(t => t.UseRabbitMq(...)
.ManageSubscriptions()
.AddEventNameResolver(type => DecideTopic(type))
.(...)
如果需要,您可以添加多个事件名称解析器 - 它们将按顺序运行,直到其中一个返回不是null
的内容。
有意义吗?