我有两项服务,经理和收藏家。
COLLECTED_USER
订阅了队列user.collected
,并调用了UserCollected
处理程序。COLLECT_USER
订阅了队列user.collect
,并调用了CollectUser
处理程序。可以有多个收集器,因此我将exclusive
设置为false
(有关代码,请参见下文)。
还有其他服务可以监听事件,例如
user.created
,user.updated
,user.deleted
此外,还有一些服务可以监听更多常规事件,例如
#.created
user.#
以此类推。
所以我正在使用topic
交换。
| exchange | type | routingKey | queueName |
| -------- | ----- | -------------- | ------------- |
| MY_APP | topic | user.collect | COLLECT_USER |
| MY_APP | topic | user.collected | COLLECTED_USER |
user.collect
user.collect
消息并调用CollectUser
处理程序CollectUser
处理程序确实起作用,然后发布带有routingKey user.collected
的消息user.collected
消息并调用UserCollected
处理程序user.collect
(正确)的消息user.collect
消息并调用CollectUser
处理程序(正确)user.collect
消息,并使用错误的数据调用UserCollected
处理程序。 (错误)CollectUser
处理程序确实起作用,然后发布带有routingKey user.collected
(正确)的消息user.collected
消息并调用UserCollected
处理程序(正确) 管理器为什么会收到user.collect
消息,原因是:
COLLECTED_USER
队列而不是COLLECT_USER
队列上监听,并且COLLECT_USER
队列的 Collector 已经处理了该消息。我按如下方式创建订阅者和发布者(针对相关性进行了修剪)
使用AMQP url
和参数url
,exchange
,type
,routingKey
,queueName
和handler
>
const connection = await amqp.connect(url)
const channel = await connection.createChannel()
channel.assertExchange(exchange, type, { durable: true })
const result = await channel.assertQueue(queueName, { exclusive: false })
channel.bindQueue(result.queue, exchange, routingKey)
channel.prefetch(1)
channel.consume(result.queue, handler)
根据AMQP url
和参数url
,exchange
和type
const connection = await amqp.connect(url)
const channel = await connection.createChannel()
await channel.assertExchange(exchange, type, { durable: true })
给定channel
和参数exchange
,routingKey
和message
await channel.publish(exchange, routingKey, message)
此问题是RabbitMQ — Why are my Routing Keys being ignored when using topic exchange 的后续问题。
答案 0 :(得分:1)
我终于弄清楚了我的问题所在。肮脏的交流。在尝试此操作时,我无意中添加了一个交换,该交换将消息路由到错误的队列,这引起了我的困惑。
要解决此问题,我启动了RabbitMQ管理员GUI并删除了所有队列,然后让我的代码创建所需的队列。上面列出的代码没有问题。