定制开发springboot集成rabbitMQ-消费者

作为rabbitMQ的生产者,定制开发发送消息到MQ的过程中,是通过routingkey定制开发发送给交换机,定制开发由交换机进行路由,定制开发把信息发送的最终的队列中。而rabbitMQ定制开发消费的时候,定制开发是要明确指明消费的队列的。

消费模式

定制开发的消费模式分为两种,定制开发推模式和拉模式。推模式使用的是Basic.Consume 进行消费,而拉模式通过调用Basic.Get进行消费。推模式用于持续的获取消息,在推模式中,RabbitMQ会不断的推送消息给消费者,不过推送的数量可以通过Basic.Qos进行限制。拉模式可以单条的获取信息。

消费端的确认和拒绝

为了保证消息可以从队列可靠的到达消费者,RabbitMQ提供了消息确认机制。消费者在订阅队列时,可以指定autoAck参数。

  • 如果autoAck参数为true,RabbitMQ会自动把发送出去的消息置为确认,并且从内存(磁盘)中删除,不关消费者是否真正进行了正确消费。
  • 如果autoAck参数设置为false,RabbitMQ会等待消费者显式地回复确认信号后才从内存或者磁盘中删除。

采用消息确认机制后,只要设置autoAck为false,消费者就有足够的时间处理消息,不用担心处理消息过程中,消费者进程断掉导致消息丢失的问题。RabbitMQ会一直等到消费者显式调用Basic.ack命令为止。

Springboot使用amqp进行消费

在springboot中,对消息进行消费有两种方式。

  • 轮询:使用rabbitMQTemplate.receive()等相关方法进行消费,每次消费一条。
  • 注册侦听器:这个方式也是更为灵活,更为常用的。通过@Bean设置监听器端点和@RabbitListener注解的方式实现。

代码演示

 @Test    public void receive() throws UnsupportedEncodingException {        Message receive = rabbitTemplate.receive("queue-msg”);//指定队列名称        System.out.println(new String(receive.getBody(),"utf-8"));        Object o = rabbitTemplate.receiveAndConvert("queue-msg”);//可以支持类型转换        System.out.println(o);    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

这是最简单的消费方式,但是可以看到,虽然简单,功能也很少。
那么更常用的是使用配置监听器的方式

@Componentpublic class RabbitMQReceiver {    @RabbitListener(queues = "test.topic",ackMode = "MANUAL")    @RabbitHandler()    public void receive(String msg,Channel channel, Message message) throws IOException, InterruptedException {        System.out.println("接收到消息:RabbitMQReceiver"+message);        Thread.sleep(2000);        channel.basicQos(2);        channel.basicAck(message.getMessageProperties().getDeliveryTag(),true);    }    @RabbitListener(queues = "test.topic",ackMode = "MANUAL")    @RabbitHandler()    public void receive2(String msg,Channel channel, Message message) throws IOException, InterruptedException {        System.out.println("wqerdf:RabbitMQReceiver"+message);        Thread.sleep(2000);        channel.basicQos(2);        channel.basicAck(message.getMessageProperties().getDeliveryTag(),true);    }}/**这里通过RabbitListener注解指定了队列名称,看到queues应该已经想到了,可以指定多个; ackMode指定了消息需要人为的确认需要注意的是,如果多个消费者方法,每个方法都要有一个RabbitListener*/
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
网站建设定制开发 软件系统开发定制 定制软件开发 软件开发定制 定制app开发 app开发定制 app开发定制公司 电商商城定制开发 定制小程序开发 定制开发小程序 客户管理系统开发定制 定制网站 定制开发 crm开发定制 开发公司 小程序开发定制 定制软件 收款定制开发 企业网站定制开发 定制化开发 android系统定制开发 定制小程序开发费用 定制设计 专注app软件定制开发 软件开发定制定制 知名网站建设定制 软件定制开发供应商 应用系统定制开发 软件系统定制开发 企业管理系统定制开发 系统定制开发