spring-boot - 在生产者中使用 sendAndReceive() 时,多个@RabbitListeners 向同一队列发送回复
问题描述
我正在将 SpringBoot 与 Spring AMQP 一起使用,并且我想在生产者中使用同步 sendAndReceive 方法来使用 RPC 模式。我的配置假设 1 次交换具有 2 个不同的绑定(1 个用于同一资源上的每个操作)。我想用 2 个不同的 routingKeys 发送 2 条消息,并在不同的回复队列上接收响应
问题是,据我所知,sendAndReceive 将等待名为“.replies”的队列上的回复,因此两个回复都将发送到products.replies
队列(至少这是我的理解)。
我的发布者配置:
@Bean
public DirectExchange productsExchange() {
return new DirectExchange("products");
}
@Bean
public OrderService orderService() {
return new MqOrderService();
}
@Bean
public RabbitTemplate rabbitTemplate(final ConnectionFactory connectionFactory) {
final RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory);
rabbitTemplate.setMessageConverter(producerJackson2MessageConverter());
return rabbitTemplate;
}
@Bean
public Jackson2JsonMessageConverter producerJackson2MessageConverter() {
return new Jackson2JsonMessageConverter();
}
和 2 个发件人:
...
final Message response = template.sendAndReceive(productsExchange.getName(), "products.get", message);
...
final Message response = template.sendAndReceive(productsExchange.getName(), "products.stock.update", message);
...
消费者配置:
@Bean
public Queue getProductQueue() {
return new Queue("getProductBySku");
}
@Bean
public Queue updateStockQueue() {
return new Queue("updateProductStock");
}
@Bean
public DirectExchange exchange() {
return new DirectExchange("products");
}
@Bean
public Binding getProductBinding(DirectExchange exchange) {
return BindingBuilder.bind(getProductQueue())
.to(exchange)
.with("products.get");
}
@Bean
public Binding modifyStockBinding(DirectExchange exchange) {
return BindingBuilder.bind(updateStockQueue())
.to(exchange)
.with("products.stock.update");
}
和@RabbitListeners 具有以下特征:
@RabbitListener(queues = "getProductBySku")
public Message getProduct(GetProductResource getProductResource) {...}
@RabbitListener(queues = "updateProductStock")
public Message updateStock(UpdateStockResource updateStockResource) {...}
我注意到第二个发送者收到 2 个响应,其中一个是无效类型(来自第一个接收者)。有什么方法可以使这些联系不同吗?还是对每个操作使用单独的交换是唯一合理的解决方案?
解决方案
据我所知, sendAndReceive 将等待名为“.replies”的队列上的回复
你从哪里得到这个想法的?
根据您使用的版本,将为每个请求创建一个临时回复队列,或者使用 RabbitMQ 的“直接回复”机制,这再次意味着每个请求都在一个名为amq.rabbitmq.reply-to
.
我看不出有任何方法可以让一个制作人得到另一个制作人的回复。即使您使用显式回复容器(通常不再需要),模板也会将回复与请求相关联。
尝试启用调试日志以查看是否提供任何提示。
推荐阅读
- nosql - 重命名文档密钥 Arango DB
- machine-learning - RDF 存储上的机器学习以检测模式
- php - 在 JMS 序列化程序中混合访问器和 SkipWhenEmpty
- python - 如何使用 Python 从容器内的文本中刮取 Td
- openstreetmap - 有没有办法在 OSRM 服务器中使用从 openstreetmap 导出的地图图块?
- wordpress - WooCommerce REST API 通过电话号码获取客户
- c++ - 虚函数覆盖是否违反 LSP?
- c# - 如何在 Tfs 的 TeamProject 中创建 Git 存储库?
- flutter - 如何在 FutureBuilder 项目的 Flutter ListView 中向上滚动时修复“跳到每个项目的顶部”?
- ssl - Heroku 的解决方法不再支持 Cloudflare 后面的 SSL(“不支持 CDN 中的严格 TLS”)?