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

相关推荐
阳光不锈@38 分钟前
三大主流消息队列架构设计思想剖析:从 RabbitMQ 到 RocketMQ 的改造实践
kafka·rabbitmq·rocketmq·rabbit改造rocket·去除rabbitmq·rabbitmq改造
VimorphTech2 小时前
一段字幕太长,怎样拆句并安排显示时间?
java·spring boot
万联WANFLOW2 小时前
Kimi K3.1 Pro 接口接入指南:模型选型、费用计算与零数据保留
java·spring boot·python·安全·spring·大模型
aiks_yuan2 小时前
Spring AI 2.1 ChatMemory 已过时用什么替代:迁移到 Session Memory 实战(JDBC 存储与会话压缩)
spring boot
博风4 小时前
Springboot4.0.9,添加Filter(拦截器)
spring boot
Java内核笔记6 小时前
同一份知识库,4 种切分 × 3 种召回,纯关键词比纯向量高 13 个点
java·人工智能·spring boot
学长毕设8 小时前
基于springboot的社会志愿者管理系统-附源码
java·spring boot·后端
计算机编程-吉哥9 小时前
计算机毕业设计 基于 SpringBoot + Vue 的剧本杀系统 Java毕业设计【任务书、开题报告、中期报告、论文、源码】
java·vue.js·spring boot·毕业设计·课程设计·计算机毕业设计选题
这里是杨杨吖9 小时前
SpringCloud+Vue民宿房屋租赁系统 附带详细运行指导视频
vue.js·spring boot·spring cloud·房屋·民宿租赁
RuoyiOffice9 小时前
SpringBoot OA推荐:面向信创选型,看看这套企业协同平台
spring boot·vue3·信创·flowable·企业协同·ruoyi office·oa选型