mq发送消息一般步骤

添加依赖

  <!--消息发送-->
  <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-amqp</artifactId>
  </dependency>

配置

  • spring:
      rabbitmq:
        host: 192.168.150.101 # 你的虚拟机IP
        port: 5672 # 端口
        virtual-host: /hmall # 虚拟主机
        username: hmall # 用户名
        password: 123 # 密码
配置消息转换器——文章末尾

发送者

注入
private final RabbitTemplate rabbitTemplate;
​
try {
        rabbitTemplate.convertAndSend(
        "pay.topic" //交换机           
        , "pay.success"  //key
        , po.getBizOrderNo());  //消息体
    } catch (Exception e) {
        log.error("支付成功的消息发送失败,支付单id:{}, 交易单id:{}", po.getId(), po.getBizOrderNo(), e);
    }

 

消费者

  • @Component
    @RequiredArgsConstructor
    public class PayStatusListener {
    ​
        private final IOrderService orderService;
    ​
        @RabbitListener(bindings = @QueueBinding(
                value = @Queue(name = "mark.order.pay.queue", durable = "true"),
                exchange = @Exchange(name = "pay.topic", type = ExchangeTypes.TOPIC),
                key = "pay.success"
        ))
        public void listenPaySuccess(Long orderId){
            orderService.markOrderPaySuccess(orderId);
        }
    }

消息后置处理器

这个方法的目的是在消息发送之前对消息进行后处理,具体地,它向消息的属性中添加了一个名为 "user-info" 的头信息,这个头信息的值是通过 UserContext.getUser() 方法获取的当前用户信息。

public class RelyUserInfoMessageProcessor implements MessagePostProcessor {
    @Override
    public Message postProcessMessage(Message message) throws AmqpException {
        message.getMessageProperties().setHeader("user-info", UserContext.getUser());
        return message;
    }
}

MessagePostProcessor 接口:这个接口是Spring AMQP提供的,用于在消息发送之前对消息进行自定义处理。通过实现这个接口,您可以修改消息的头部、属性、负载等。

 

消息转换器

在处理发送对象的时候使用 JSON 格式来对信息进行序列化,首先引入依赖

    <dependency>
        <groupId>com.fasterxml.jackson.dataformat</groupId>
        <artifactId>jackson-dataformat-xml</artifactId>
    </dependency>

👉 配置消息转换器到 ApplicationContext 中,即声明 Bean,可以通过写 Config 类的方式实现,这里直接将声明写到主方法中

发送者
@SpringBootApplication
public class PublisherApplication {
    public static void main(String[] args) {
        SpringApplication.run(PublisherApplication.class, args);
    }
    @Bean
    public MessageConverter MessageConverter() {
        return new Jackson2JsonMessageConverter();
    }
​
}
消费者
@SpringBootApplication
public class ConsumerApplication {
    public static void main(String[] args) {
        SpringApplication.run(ConsumerApplication.class, args);
    }
    @Bean
    public MessageConverter MessageConverter() {
        return new Jackson2JsonMessageConverter();
    }
}
posted @ 2024-07-20 21:45  冷风5997  阅读(41)  评论(0)    收藏  举报