springboot 操作rabbitmq 的一些心得记录

导入的pom是:

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

先常见一个消息生产者:

import com.techen.tap.vo.ResponseResult;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/mq")
public class AAmqController {
    @Autowired
    private RabbitTemplate rabbitTemplate;

    @GetMapping("/send")
    public ResponseResult<Object> send()
    {
        rabbitTemplate.convertAndSend("lihao" , "user" , "消息1");
        return ResponseResult.ok("ok");
    }
}

一个消费者:

@RestController
@RequestMapping("/consumer")
public class AAmqConsumerController {

    @RabbitListener(bindings = {
            @QueueBinding(value = @Queue,
            exchange = @Exchange(value = "lihao"),
            key = {"user", "error", "warning"}
            )
    })
    @RabbitHandler
    public void get(Message message)
    {
        System.out.print(new String(message.getBody()) + "-----------------------");
    }
}
convertAndSendReceive表示发送消息有序。 发一条, 等消费者消费完后才发下一条。 这个和消费者手动确认那个不是一回事。

如果想使用消息手动确认机制, 就要在消费者的方法中加入  Channel参数。 传过来一个通道。

然后从通道设置ACK。

这里注意要导对包:

import com.rabbitmq.client.Channel;  别的包不好使!

没有设置手动确认前,自动确认时,消息会一次性发给消费者,存在消费者的通道里, 队列会清空。

设置手动确认后,消息发给消费者后,会等待消费者向mq确认, 消费者确认后, mq才会接着发送下一条数据。

设置手动确认的同时,一般会同时设置QOS , 一次只发送一条消息。

使用ACK手动确认:

channel.basicAck(message.getMessageProperties().getDeliveryTag() , false);

basicAck的第一个参数表示:消息的index , 应为消息是存放在队列里的,队列里的数据都有索引index ,  basicAck会告诉mq 这个索引对应的消息已经被我消费。 第二个参数是 设置是否批量确认。

如果为true , basicAck会告诉mq 这个index索引对应的消息和他之前的消息都已经被我消费。  如果为false , 表示不支持批量, basicAck会告诉mq 单单这一条Index的索引对应的消息被我消费。

使用QOS限流:

channel.basicQos(0, 1 ,true);

第一个参数表示: mq一次发送消息的内容的最大长度。 0表示对消息大小没有限制。

第二个参数表示:mq一次发送不超过这个参数的消息个数, 如果传值为3 , mq一次会发送不超过3条消息给消费者。

第三个参数表示:以上这些设置是适用于整个通道还是只适用于当前消费者, true表示使用与整个通道, false表示使用与当前消费者。

使用NACK拒绝消息:

channel.basicNack(x ,x , x)

第一个参数表示这条消息的index

第二个参数表示是否批量, 如果为true,表示为批量,mq会被告知当前index和他之前的消息全部处理失败,如果给false,表示不批量,mq会被告知仅当前index所对应的消息处理失败。

第三个参数表示 对于处理失败的消息是否重回队列。true表示重回队列, false表示丢弃。 对于重回队列的消息, 又会被消费者重新消费。

详细内容参考:https://www.cnblogs.com/cuijl/p/8075130.html

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值