Springboot整合rabbitmq实现消息的发送接收

1、需要引入spring-boot-starter-amqp:

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-amqp</artifactId>

</dependency>

2、进行相关的配置:

RabbitMQ配置

spring.rabbitmq.host=localhost

spring.rabbitmq.port=5672

虚拟主机配置

spring.rabbitmq.virtual-host=/

开启发送端消息抵达Broker确认

spring.rabbitmq.publisher-confirms=true

开启发送端消息抵达Queue确认

spring.rabbitmq.publisher-returns=true

只要消息抵达Queue,就会异步发送优先回调returnfirm

spring.rabbitmq.template.mandatory=true

手动ack消息,不使用默认的消费端确认

spring.rabbitmq.listener.simple.acknowledge-mode=manual

3、使用,4个重要的注解:

(1)@AmqpAdmin:管理组件,可以用来声明交换机、队列、以及绑定交接机和队列

(2)RabbitTemplate:消息发送处理组件

(3)@RabbitListener 监听消息的方法可以有三种参数(不分数量,顺序):Object content, Message message, Channel channel ,可用于类上和方法上。

(4)@RabbitHandler 监听消息,用于方法上。

使用示例:

java 复制代码
public class GulimallOrderApplicationTests {

    public static final String EXCHANGE="hello-java-exchange";
    public static final String QUEUE="hello-java-queue";
    public static final String ROUTINGKEY="hello-java";

     @Autowired
     private AmqpAdmin amqpAdmin;
     @Autowired
     private RabbitTemplate rabbitTemplate;

     //发送字符串对象消息
     @Test
     public void  sengMessageStrTest(){
         String message="Hello,RabbitMQ";
         rabbitTemplate.convertAndSend(EXCHANGE,ROUTINGKEY,message);
         log.info("消息:{}发送完成",message);
     }

    //发送对象消息
    @Test
    public void  sengMessageTest(){
        OrderReturnReasonEntity returnReasonEntity = new OrderReturnReasonEntity();
        returnReasonEntity.setName("hahaha");
        returnReasonEntity.setId(1L);
        returnReasonEntity.setCreateTime(new Date());
        rabbitTemplate.convertAndSend(EXCHANGE,ROUTINGKEY,returnReasonEntity);
        log.info("消息:{}发送完成",returnReasonEntity);
    }

    @Test
    public void  sengMessageReceiveOnly(){
        for (int i = 0; i < 10; i++) {
            if(i%2==0){
                OrderReturnReasonEntity returnReasonEntity = new OrderReturnReasonEntity();
                returnReasonEntity.setName("hahaha:"+i);
                returnReasonEntity.setId(1L);
                returnReasonEntity.setCreateTime(new Date());
                rabbitTemplate.convertAndSend(EXCHANGE,ROUTINGKEY,returnReasonEntity);
                log.info("消息:{}发送完成",returnReasonEntity);
            }else{
                OrderEntity order=new OrderEntity();
                order.setOrderSn(UUID.randomUUID().toString());
                rabbitTemplate.convertAndSend(EXCHANGE,ROUTINGKEY,order);
                log.info("消息:{}发送完成",order);
            }

        }

    }

    @Test
    void createExchange() {
        DirectExchange directExchange = new DirectExchange(EXCHANGE, true, false);
        amqpAdmin.declareExchange(directExchange);
        log.info("exchange:{}创建成功",directExchange.getName());

    }

    @Test
    void createQueue() {
        Queue queue = new Queue(QUEUE, true, false,false);
        amqpAdmin.declareQueue(queue);
        log.info("队列:{}创建成功",queue.getName());
    }

    @Test
    void createBinding(){
        Binding binding = new Binding(QUEUE, Binding.DestinationType.QUEUE, EXCHANGE,ROUTINGKEY , null);
        amqpAdmin.declareBinding(binding);
        log.info("创建绑定成功");
    }

}

监听接收消息:

java 复制代码
@Service("orderService")
@RabbitListener(queues = {"hello-java-queue"})
public class OrderServiceImpl extends ServiceImpl<OrderDao, OrderEntity> implements OrderService {


    @RabbitHandler
    public void receiveMessage(Message message, OrderReturnReasonEntity content, Channel channel) throws InterruptedException {
        //接收到的消息体
        byte[] body = message.getBody();
        //MessageProperties properties = message.getMessageProperties();
        System.out.println("接收到的消息:"+content);
        //Thread.sleep(3000);
        System.out.println("消息处理完成:"+content.getName());
    }

    @RabbitHandler
    public void receiveMessage2(OrderEntity content) throws InterruptedException {

        System.out.println("接收到的消息:"+content);
    }

}

@RabbitListener 的@RabbitHandler可以组合使用,@RabbitListener用于类上,@RabbitHandler用于方法上,用于区分接收到不同消息或者不同队列的消息。

相关推荐
一只小小Java1 小时前
Naocs本地部署&安装3.2.3+Spring boot 3.2.0
java·spring boot·后端·nacos
JL151 小时前
Spring Boot vs Gin:Java 人搭第一个 Go REST API
java·spring boot·gin
码兄科技9 小时前
实战:基于Spring Boot + UniApp的地理信息小程序开发
spring boot·后端·uni-app
豆瓣鸡17 小时前
Guava RateLimiter 限流实战:从令牌桶原理到 Nacos 动态配置
spring boot·微服务·nacos·guava
笑小枫17 小时前
用 Claude Code 推翻重写笑小枫网站
java·人工智能·spring boot·ai编程
dkbnull1 天前
Spring Boot请求处理组件对比详解
java·spring boot
不能只会打代码1 天前
Day 011 — Spring 全家桶深度拆解
spring boot·mybatis·spring aop·spring mvc·spring ioc
吴声子夜歌1 天前
MongoDB 4.x——SpringBoot框架整合
数据库·spring boot·mongodb
snow@li1 天前
Spring Boot:项目服务器完整部署教程(零基础可直接实操)
服务器·spring boot·后端
万亿少女的梦1681 天前
基于Spring Boot、Java与MySQL的网络订餐系统设计与实现
java·spring boot·mysql·系统设计·网络订餐