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用于方法上,用于区分接收到不同消息或者不同队列的消息。

相关推荐
阿丰资源1 小时前
基于Spring Boot的电影城管理系统(直接运行)
java·spring boot·后端
消失的旧时光-19432 小时前
Spring Boot 工程化进阶:统一返回 + 全局异常 + AOP 通用工具包
java·spring boot·后端·aop·自定义注解
StockTV3 小时前
印度股票实时数据 NSE和BSE的实时行情、K 线及指数数据
java·开发语言·spring boot·python
橘子海全栈攻城狮4 小时前
【最新源码】养老院系统管理A013
java·spring boot·后端·web安全·微信小程序
敖正炀4 小时前
反模式与排查宝典:Spring Boot 自动配置与核心机制的常见陷阱
spring boot
直奔標竿5 小时前
Java开发者AI转型第二十六课!Spring AI 个人知识库实战(五)——联网搜索增强实战
java·开发语言·人工智能·spring boot·后端·spring
吴爃6 小时前
Spring Boot 项目在 K8S 中的打包、部署与运维发布实践
运维·spring boot·kubernetes
a8a3027 小时前
Laravel8.x新特性全解析
java·spring boot·后端
白露与泡影7 小时前
Spring Boot 完整流程
java·spring boot·后端