如何使Rebus在RabbitMQ中与自定义主题交换配合使用?

如何使Rebus在RabbitMQ中与自定义主题交换配合使用?,rabbitmq,rebus,Rabbitmq,Rebus,Rebus有一个灵活的系统,允许我为不同的消息类型指定不同的端点,可以在web.config中,也可以通过实现自定义IDetermineMessageOwnership 据我所知,消息所有权仅由字符串表示。使用MSMQ传输,此字符串指向消息传递到的队列。对于RabbitMQ,字符串用作消息的主题,然后将消息传递到名为“Rebus”的通用交换。Rebus是个不错的家伙,因此他还使用相同的名称在RabbitMQ服务器中设置了一个队列,并在Rebus exchange中从主题绑定到队列 我的问题是:有

Rebus有一个灵活的系统,允许我为不同的消息类型指定不同的端点,可以在
web.config
中,也可以通过实现自定义
IDetermineMessageOwnership

据我所知,消息所有权仅由字符串表示。使用MSMQ传输,此字符串指向消息传递到的队列。对于RabbitMQ,字符串用作消息的主题,然后将消息传递到名为“Rebus”的通用交换。Rebus是个不错的家伙,因此他还使用相同的名称在RabbitMQ服务器中设置了一个队列,并在Rebus exchange中从主题绑定到队列

我的问题是:有没有可能让Rebus不创建队列和绑定,但仍然将消息传递到为每条消息设置了相关主题的exchange

手动声明队列和绑定将允许我设置一个很棒的主题交换,使用带有通配符的绑定等等。下面是一个很好的例子,展示了一个主题交换和时髦的绑定,只是为了让我的问题看起来更加圆滑和性感:


我觉得你想做这样的事情:

Configure.With(yourFavoriteContainer)
         .Transport(t => t.UseRabbitMq(...)
                          .ManageSubscriptions()) //< BAM!!1
         .(...)
如果需要,可以添加多个事件名称解析程序-它们将按顺序运行,直到其中一个返回的内容不是
null


这有意义吗?

您的答案似乎假定采用发布/订阅样式的实现。我不确定这是否是我想要的。我的消息都是有一个端点来处理的类型,只是我想用RabbitMQ来定义到该端点的路由,而不是用web.config或代码。例如:我们的网站将发送五种不同类型的消息。它们都通过同一个exchange进入本地RabbitMQ安装上的单个队列,从那里它们都被铲到后端箱上的一个exchange,在后端箱中,主题/路由密钥用于将它们拆分为三个端点的三个单独队列。如果以后我们想将三个端点中的一个移动到另一个框中,系统管理员可以通过RabbitMQ的web界面进行配置,而无需触摸网站。这疯了吗?不要调用
bus.Subscribe
then,然后从以.NET类型的全名命名的主题创建并维护绑定,例如
SomeNamespace.SomeEvent
我添加了
ManageSubscriptions()
到我的配置,并设置从
命名空间。*
到RabbitMQ上Rebus exchange中的队列的绑定。当我执行
bus.Publish(msg)
。应用程序控制台输出显示“正在将Namespace.Type发送到Namespace.Type”,但我在RabbitMQ管理页面上看到的都是零:(我欠你一杯啤酒!我的通配符绑定确实是罪魁祸首。现在一切似乎都运行得很顺利。非常感谢!
Configure.With(yourFavoriteContainer)
         .Transport(t => t.UseRabbitMq(...)
                          .ManageSubscriptions()
                          .AddEventNameResolver(type => DecideTopic(type))
         .(...)