servicestack 如何将RoutingKey与ServiceStack和RabbitMQ一起使用,servicestack,rabbitmq,servicestack,Rabbitmq" /> servicestack 如何将RoutingKey与ServiceStack和RabbitMQ一起使用,servicestack,rabbitmq,servicestack,Rabbitmq" />

servicestack 如何将RoutingKey与ServiceStack和RabbitMQ一起使用

servicestack 如何将RoutingKey与ServiceStack和RabbitMQ一起使用,servicestack,rabbitmq,servicestack,Rabbitmq,我有两个相同的站点,它们将使用新客户机使用RabbitMQ消息。理想情况下,生产者应该能够通过队列名称或路由密钥指定站点。前者可以作为发布参数,但后者我无权访问。此外,在服务端,使用者似乎只能订阅基于约定的队列名称,即mq.myrequest.inq,而我似乎无法利用路由密钥 有没有一种方法可以使用我自己的路由密钥发布和订阅,或者基于显式队列名称(即mq.myrequest.site1.inq)注册处理程序?没有。ServiceStack的RabbitMq支持通常基于类型名,并且自以为是地充当工

我有两个相同的站点,它们将使用新客户机使用RabbitMQ消息。理想情况下,生产者应该能够通过队列名称或路由密钥指定站点。前者可以作为发布参数,但后者我无权访问。此外,在服务端,使用者似乎只能订阅基于约定的队列名称,即mq.myrequest.inq,而我似乎无法利用路由密钥


有没有一种方法可以使用我自己的路由密钥发布和订阅,或者基于显式队列名称(即mq.myrequest.site1.inq)注册处理程序?

没有。ServiceStack的RabbitMq支持通常基于类型名,并且自以为是地充当工作队列。它设计为无需配置且易于使用,因此可以自动处理要使用的交换、路由密钥和队列名称的详细信息


如果您需要高级配置或自定义配置,最好直接使用底层配置。

目前我使用了静态QueueNames.SetQueuePrefix(“site1:”)来解决这个问题,但建议您对队列命名进行一些控制,也许通过允许对QueueNames进行子分类,或者在队列服务器构造函数中插入QueueNames工厂?用户对QueueNames的实现可以允许访问队列名称的组成部分,以允许mq.sub.part.MyType.ext.inq等组合,从而避免在同一主机中使用相同请求类型的情况。@NeilDobson ok应该会有帮助。这看起来很好。我分叉代码是为了以不同的方式执行此操作,但您的解决方案要优雅得多。我现在来看看。它工作得很好,但我不确定队列解析器fn的实现。默认情况下,队列名称由以下内容构成:QueuePrefix+MqPrefix+typeName+queueSuffix。您可以使用SetQueuePrefix静态方法自由访问和更改前缀。但是,一旦实现了自己的ResolveQueueNameFn,就不再使用前缀。但是不研究代码就不清楚为什么。例如:type of MyType会导致队列名为pre:mq:MyType.inq,但一旦覆盖队列名,前缀和mq:就会被删除。为了重新恢复相同的命名约定,您需要以下内容:QueueNames.ResolveQueueNameFn=(typeName,extension)=>string.Format(“{0}{1}{2}{3}{4}”,QueueNames.QueuePrefix,QueueNames.MqPrefix,site,typeName,extension);