springboot整合rabbitMQ

1、依赖

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

2、配置文件

#基本配置
spring.rabbitmq.addresses=localhost:5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest
spring.rabbitmq.virtual-host=/
spring.rabbitmq.connection-timeout=15000
 
#整合rabbitmq消费者
#当前监听容器数
spring.rabbitmq.listener.concurrency=5 
#最大数
spring.rabbitmq.listener.max-concurrency=10
#签收模式:手动应答
spring.rabbitmq.listener.acknowledge-mode=manual
#限流 - 每次只消费一条
spring.rabbitmq.listener.prefetch=1

确认模式
AcknowledgeMode.NONE:不确认
AcknowledgeMode.AUTO:自动确认
AcknowledgeMode.MANUAL:手动确认

3、消费者类

/**
 * 接收消息
 */
@Component
public class OrderReceiver {
 
    /**
     * 交换机、队列不存在的话,以下注解可以自动创建交换机和队列
     *
     */
    @RabbitListener(bindings = @QueueBinding(
            value = @Queue(value = "order-queue", durable = "true",arguments = {@Argument(name = "x-max-length", value = "500", type = "java.lang.Integer")}),
            exchange = @Exchange(value = "order-exchange", durable = "true", type = "topic"),
            key = ""
    ))
 
    /**
     * 消费者接收消息并消费消息
     */
    @RabbitHandler
    public void onOrderMessage(@Payload Message<?> msg,
                               @Headers Map<String, Object> headers,
                               Channel channel) throws Exception {

        System.out.println("--------------收到消息,开始消费------------");
        byte[] payload = (byte[]) msg.getPayload();
        Map<String, Object> map = (Map<String, Object>) JSON.parse(new String(payload));

        Long deliveryTag = (Long) headers.get(AmqpHeaders.DELIVERY_TAG);
        // ACK
        channel.basicAck(deliveryTag, false);
    }
}

arguments参数注释

1、x-max-length:
  消息条数限制,该参数是非负整数值。限制加入queue中消息的条数。先进先出原则,超过10条后面的消息会顶替前面的消息。
2、x-max-length-bytes
 消息容量限制,该参数是非负整数值。该参数和x-max-length目的一样限制队列的容量,但是这个是靠队列大小(bytes)来达到限制。
3、x-message-ttl
 消息存活时间,该参数是非负整数值.创建queue时设置该参数可指定消息在该queue中待多久,可根据x-dead-letter-routing-key和x-dead-letter-exchange生成可延迟的死信队列。
4、x-max-priority
 消息优先级,创建queue时arguments可以使用x-max-priority参数声明优先级队列 。该参数应该是一个整数,表示队列应该支持的最大优先级。建议使用1到10之间。目前使用更多的优先级将消耗更多的资源(Erlang进程)。
 设置该参数同时设置死信队列时或造成已过期的低优先级消息会在未过期的高优先级消息后面执行。该参数会造成额外的CPU消耗。
5、x-expires
   存活时间,创建queue时参数arguments设置了x-expires参数,该queue会在x-expires到期后queue消息,亲身测试直接消失(哪怕里面有未消费的消息)。
6、x-dead-letter-exchange和x-dead-letter-routing-key
   创建queue时参数arguments设置了x-dead-letter-routing-key和x-dead-letter-exchange,会在x-message-ttl时间到期后把消息放到x-dead-letter-routing-key和x-dead-letter-exchange指定的队列中达到延迟队列的目的。

手动确认

  • 成功

消费者成功处理后,调用channel.basicAck(message.getMessageProperties().getDeliveryTag(), false)方法对消息进行确认。

void basicAck(long deliveryTag, boolean multiple) throws IOException;
deliveryTag:该消息的index
multiple:是否批量. true:将一次性ack所有小于deliveryTag的消息。

  • 失败

channel.basicNack 与 channel.basicReject 的区别在于basicNack可以批量拒绝多条消息,而basicReject一次只能拒绝一条消息。

void basicNack(long deliveryTag, boolean multiple, boolean requeue) throws IOException;
deliveryTag:该消息的index。
multiple:是否批量. true:将一次性拒绝所有小于deliveryTag的消息。
requeue:被拒绝的是否重新入队列。

void basicReject(long deliveryTag, boolean requeue) throws IOException;
deliveryTag:该消息的index。
requeue:被拒绝的是否重新入队列。

4、消费者类

@Component
public class RabbitMQSender {
 
	@Autowired
	private RabbitTemplate rabbitTemplate;
	
	public void send(byte[] msg) throws Exception{
		CorrelationData correlationData =new CorrelationData();
		correlationData.setId(order.getMessageId());
		rabbitTemplate.convertAndSend("exchange", // 交换机
                        "", // 匹配消息队列的Key
                        msg, // 消息体
                        new Date().getTime()); // 消息ID
	}
}

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值