我正在将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个响应,其中一个响应类型无效(来自第一个接收方)。有什么方法可以使这些连接与众不同?还是对每个操作使用单独的交换是唯一合理的解决方案?
我正在将SpringBoot与Spring AMQP一起使用,并且我想在生产者中通过同步sendAndReceive方法使用RPC模式。我的配置假设1个交换具有2个不同的绑定(每个绑定有1个...
据我所知,sendAndReceive将在名称为“ .replies”的队列上等待答复。