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

相关推荐
Mr_Air_Boy32 分钟前
SpringBoot使用dynamic配置多数据源时使用@Transactional事务在非primary的数据源上遇到的问题
java·spring boot·后端
棠十一2 小时前
Rabbitmq
分布式·docker·rabbitmq
陈暗暗2 小时前
rabbitMQ初入门
rabbitmq
懒虫虫~2 小时前
基于SpringBoot解决RabbitMQ消息丢失问题
spring boot·rabbitmq
java干货3 小时前
深度解析:Spring Boot 配置加载顺序、优先级与 bootstrap 上下文
前端·spring boot·bootstrap
sclibingqing4 小时前
SpringBoot项目接口集中测试方法及实现
java·spring boot·后端
KK溜了溜了6 小时前
JAVA-springboot log日志
java·spring boot·logback
我命由我123457 小时前
Spring Boot 项目集成 Redis 问题:RedisTemplate 多余空格问题
java·开发语言·spring boot·redis·后端·java-ee·intellij-idea
面朝大海,春不暖,花不开7 小时前
Spring Boot消息系统开发指南
java·spring boot·后端
hshpy7 小时前
setting up Activiti BPMN Workflow Engine with Spring Boot
数据库·spring boot·后端