我在微服务环境中设置了RabitMQ。我有一个配置文件如下:
@Configuration
public class RabbitMQConfig {
@Bean
public DirectExchange restaurantScoreExchange() {
return new DirectExchange("restaurant-score-exchange");
}
}
字符串
生产者是这样设置的:
@Component
@Import(RabbitMQConfig.class)
public class RabbitMQMessageProducer {
private final AmqpTemplate rabbitTemplate;
@Autowired
public RabbitMQMessageProducer(AmqpTemplate rabbitTemplate) {
this.rabbitTemplate = rabbitTemplate;
}
public void sendUpdateMessage(Long restaurantId, String message) {
// Send the message with a routing key indicating the restaurant ID
rabbitTemplate.convertAndSend("restaurant-score-exchange", restaurantId.toString(), message);
}
}
型
调用生产者的控制器看起来像这样:
@Autowired
private final RabbitMQMessageProducer rabbitMQMessageProducer;
void randomMethod() {
...
rabbitMQMessageProducer.sendUpdateMessage(newUser.getFavoriteRestaurantId(), "newUser");
...
}
型
接收方(在另一个微服务中)具有相同的配置类,看起来像这样:
@Component
@Import(RabbitMQConfig.class)
public class RabbitMQMessageReceiver {
private final ObjectMapper objectMapper;
public RabbitMQMessageReceiver(ObjectMapper objectMapper) {
this.objectMapper = objectMapper;
}
@RabbitListener(queues = "restaurant-score-exchange")
public void handleMessage(String message) {
try {
JsonNode messageJson = objectMapper.readTree(message);
Long restaurantId = messageJson.get("restaurantId").asLong();
// Implement the logic to update the score for the respective restaurant
} catch (Exception e) {
System.err.println("Error handling message: " + e.getMessage());
}
}
}
型
这是我第一次尝试消息生成器。消息被发送,但它似乎没有得到处理,因为我在其中放置了一个断点,它没有被触发。
我一直在阅读并试图解决这个问题,但没有成功。谢谢你的时间
1条答案
按热度按时间5lhxktic1#
不能从交换中使用;必须从队列中使用;声明一个队列并使用路由键将其绑定到交换。
对于
DirectExchange
,每个restaurantId
都需要一个绑定。对于TopicExchange
,您可以使用单个路由关键字#
绑定,该关键字是“all”的通配符。请访问https://docs.spring.io/spring-amqp/docs/current/reference/html/#binding
字符串
请参阅RabbitMQ教程以了解不同的交换类型。
https://www.rabbitmq.com/getstarted.html
这里有Spring AMQP版本的教程。