spring 如何使用RabbitMQ正确发送和接收消息(消息发送但不处理?)

2ul0zpep  于 2023-11-16  发布在  Spring
关注(0)|答案(1)|浏览(120)

我在微服务环境中设置了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());
        }
    }
}


这是我第一次尝试消息生成器。消息被发送,但它似乎没有得到处理,因为我在其中放置了一个断点,它没有被触发。
我一直在阅读并试图解决这个问题,但没有成功。谢谢你的时间

5lhxktic

5lhxktic1#

不能从交换中使用;必须从队列中使用;声明一个队列并使用路由键将其绑定到交换。
对于DirectExchange,每个restaurantId都需要一个绑定。对于TopicExchange,您可以使用单个路由关键字#绑定,该关键字是“all”的通配符。
请访问https://docs.spring.io/spring-amqp/docs/current/reference/html/#binding

Binding b = BindingBuilder.bind(someQueue).to(someTopicExchange).with("#");

字符串
请参阅RabbitMQ教程以了解不同的交换类型。
https://www.rabbitmq.com/getstarted.html
这里有Spring AMQP版本的教程。

相关问题