RabbitMQ(四) springboot整合rabbitmq详解

本文详细介绍了如何使用Spring Boot搭建RabbitMQ消息队列系统,包括生产者和消费者的创建过程,配置依赖,消息确认及回调机制,以及消息体和消息头的注入方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、创建生产者

1、创建springboot项目引入依赖

       <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-amqp</artifactId>
        </dependency>

2、properties中配置rabbitmq

#rabbitmq 地址
spring.rabbitmq.addresses=39.105.104.195:5677
#rabbitmq 用户名
spring.rabbitmq.username=guest
#rabbitmq 密码
spring.rabbitmq.password=guest
#指定rabbitmq虚拟主机 默认是/
spring.rabbitmq.virtual-host=/
#rabbitmq 连接超时时间
spring.rabbitmq.connection-timeout=15000
#rabbitmq 消息发送到交换机确认机制,ack
spring.rabbitmq.publisher-confirms=true
#rabbitmq 是否确认回调
spring.rabbitmq.publisher-returns=true
# true 监听器接收不可达消息进行处理,false broker自动删除消息 默认为false
spring.rabbitmq.template.mandatory=true

3、创建rabbitmq类配置 确认和回调

/**
 * @author kang
 * @version 1.0
 * @date 2020/3/30 16:31
 */
@Component
@Slf4j
public class RabbitSender {

    @Autowired
    private RabbitTemplate rabbitTemplate;

    private final ConfirmCallback confirmCallback = (correlationData, ack, s) -> {
            log.info("correlationData={}",correlationData);
            log.info("ack={}",ack);
            if (ack){
                log.info("更新订单状态");
            }else {
                log.error("处理异常:{}",s);
            }
    };

    private final RabbitTemplate.ReturnCallback callback = (message, errorCode, text, exchange, routingKey)
            -> {
        log.error("return exchange :{},routingKey:{},message:{},code:{},text:{}"
                ,exchange,routingKey,message,errorCode,text);
        log.info("找不到对应的队列");
    };


    public void sendOrder(OrderMessageDto message ) throws Exception{

        rabbitTemplate.setConfirmCallback(confirmCallback);

        rabbitTemplate.setReturnCallback(callback);

        CorrelationData correlationData = new CorrelationData("test-hello"+ LocalDateTime.now().toString());

        rabbitTemplate.convertAndSend("order-exchange","order2.test",message,correlationData);

    }
}

创建发送的消息对象

/**
 * @author kang
 * @version 1.0
 * @date 2020/4/1 9:17
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
public class OrderMessageDto implements Serializable {

    private Long orderNumber;

    private String orderName;

    private Double price;

    private LocalDateTime time;

}

测试投递

@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringbootProducerApplicationTests {
	@Autowired
    private RabbitSender sender;

	@Test
    public void testSender2() throws Exception {
        OrderMessageDto dto = new OrderMessageDto(1l,"测试订单",250.0,LocalDateTime.now());
        sender.sendOrder(dto);
        Thread.sleep(2000);
    }

}

在这里插入图片描述

标题 二、创建消费者

1、创建springboot项目引入依赖

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-amqp</artifactId>
        </dependency>

        <dependency>
            <groupId>com.kang</groupId>
            <artifactId>springboot-producer</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>

2、配置properties

#########################################################
#rabbitMQ
#########################################################
spring.rabbitmq.addresses=39.105.104.195:5677
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest
spring.rabbitmq.virtual-host=/
spring.rabbitmq.connection-timeout=15000
spring.rabbitmq.listener.simple.concurrency=5
spring.rabbitmq.listener.simple.max-concurrency=10
#手动签收
spring.rabbitmq.listener.simple.acknowledge-mode=manual
spring.rabbitmq.listener.simple.prefetch=1

spring.rabbitmq.listener.order.queue.name=order-queue
spring.rabbitmq.listener.order.queue.durable=true
spring.rabbitmq.listener.order.exchange.name=order-exchange
spring.rabbitmq.listener.order.exchange.type=topic
spring.rabbitmq.listener.order.exchange.durable=true
spring.rabbitmq.listener.order.exchange.ignoreDeclarationExceptions=true
spring.rabbitmq.listener.order.key=order2.*

3、创建配置类


/**
 * @author kang
 * @version 1.0
 * @date 2020/3/31 10:22
 */
@Component
@Slf4j
public class RabbitReceiver {
	 /**
     * 声明topic类型交换机和队列
     * @param messageDto
     * @param headers
     * @param channel
     * @throws Exception
     */
    @RabbitHandler
    @RabbitListener(
            bindings = @QueueBinding(
            		//声明队列
                    value = @Queue(
                            value = "${spring.rabbitmq.listener.order.queue.name}",
                            durable = "${spring.rabbitmq.listener.order.queue.durable}"
                        
                    ),
                    //声明交换机
                    exchange = @Exchange(
                            value = "${spring.rabbitmq.listener.order.exchange.name}" ,
                            type = "${spring.rabbitmq.listener.order.exchange.type}" ,
                            durable = "${spring.rabbitmq.listener.order.exchange.durable}" ,
                            ignoreDeclarationExceptions = "${spring.rabbitmq.listener.order.exchange.ignoreDeclarationExceptions}"),
                    //声明路由键
                    key = "${spring.rabbitmq.listener.order.key}"
            )
    )
    public void onOrderMessage(@Payload OrderMessageDto messageDto, @Headers Map<String,Object> headers, Channel channel) throws Exception{
        log.info("message : {}",messageDto.toString());
        Long deliveryTag = (Long) headers.get(AmqpHeaders.DELIVERY_TAG);

        if(messageDto.getOrderNumber().equals("")){
            /**
             * multiple 是否批量处理
             * requeue 是否重回队列
             * 将消息重新投递回broker中队列的尾端( 重回队列)
             */

            channel.basicNack(deliveryTag,false,true);
        }else{
            //手工ack 确认签收
            channel.basicAck(deliveryTag,false);
        }

    }
}

@Header 注入消息头的单个属性
@Payload 注入消息体到一个JavaBean中
@Headers 注入所有消息头到一个Map中
@RabbitListener 注解标记方法,当监听到队列中有消息时则会进行接收并处理
@RabbitListener注解指定目标方法来作为消费消息的方法,通过注解参数指定所监听的队列或者Binding。

4、启动消费者消费生产者发送的消息
在这里插入图片描述
打开控制台查看队列
消费前:
在这里插入图片描述
消费后:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值