Я использую SpringBoot с Spring AMQP и хочу использовать шаблон RPC, используя синхронный метод sendAndReceive в продюсере.Моя конфигурация предполагает 1 обмен с 2 различными привязками (1 для каждой операции на одном и том же ресурсе).Я хочу отправить 2 сообщения с 2 разными RouingKeys и получить ответ в разных очередях ответа
Проблема в том, насколько я знаю, 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);
...
customer config:
@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 ответа, один из которых имеет недопустимый тип (от первого получателя)).Есть ли способ, которым я могу сделать эти связи отличными?Или использование раздельного обмена для каждой операции - единственное разумное решение?