我正在将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个响应,其中一个响应类型无效(来自第一个接收方)。有什么方法可以使这些连接与众不同?还是为每个操作使用单独的交换是唯一合理的解决方案?
答案 0 :(得分:2)
据我所知,sendAndReceive将在名称为“ .replies”的队列上等待答复
你从哪里得到这个主意的?
根据您使用的版本,将为每个请求创建一个临时答复队列,或者使用RabbitMQ的“直接答复”机制,这再次意味着每个请求都在称为{{ 1}}。
我看不到任何一位制片人要得到另一位制片人的答复;即使您使用显式答复容器(通常不再需要),模板也会将答复与请求相关联。
尝试启用DEBUG日志记录以查看是否提供任何提示。