Springcloud Stream整合Rabbitmq(生产者和消费者)

目录

一、引入Rabbitmq概念

二、Rabbitmq安装

三、代码编写

生产者

消费者


一、引入Rabbitmq概念

RabbitMQ是实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间件)。RabbitMQ服务器是用Erlang语言编写的,而集群和故障转移是构建在开放电信平台上的。所有主要的编程语言均有与代理接口通讯的客户端库。


RabbitMq的特性:

(1)可靠性:使用一些机制来保证可靠性,如持久化、传输确认、发布确认

(2)灵活的路由:在消息进入队列之前,通过Exchange来路由消息。对于典型的路由功能,RabbitMQ已经提供了一些内置的Exchange来实现,针对复杂的路由功能,可以将多个Exchage绑定在一起,也通过插件机制实现自己的Exchange

(2)消息集群:多个RabbitMQ服务器可以组成一个集群,形成一个逻辑Broker

(4)高可用:队列可以在集群中的机器上进行镜像,使得在部分节点出现问题的情况下队列仍然可用

(5)多种协议:RabbitMQ迟滞多种消息队列协议,比如STOMP、MQTT等

(6)多语言客户端:RabbitMQ几乎迟滞所有常用语言,比如java、net、ruby

(7)管理界面:RabbitMQ提供了一个易用的用户界面,使得用户可以监控和管理消息Broker的许多方面

二、Rabbitmq安装

详情请点:Docker安装RabbitMq超详细步骤_菜鸟小邓的博客-CSDN博客

三、代码编写

生产者

引入依赖 pom.xml


        org.springframework.cloud
        spring-cloud-starter-stream-rabbit
    

配置文件application.yaml

server:
  port: 8801

spring:
  application:
    name: cloud-stream-provider
  cloud:
    stream:
      binders: #配置要绑定的rabbitmq的服务信息
        rabbit: #表示定义的名称,用于bingding的整合
          type: rabbit
          enviroment:
            spring:
              rabbitmq:
                host: 127.0.0.1
                port: 5672
                username: guest
                password: guest
      bindings: #服务的整合处理
        output:
          destination: studentExchange #表示要使用的exchange的名称定义
          content-type: application/json
          binder: rabbit
  rabbitmq:
    host: 127.0.0.1
    port: 5672
    username: guest
    password: guest

生产者发送消息方法 MessageProvideImpl

@EnableBinding(Source.class)
public class MessageProvideImpl implements IMessageProvide {
    @Resource
    MessageChannel output;
    //生产数据放入list
    public static List list = new ArrayList<>();
    {
        for (int i = 1; i <= 100000; i++) {
            list.add(String.valueOf(i));
        }
    }

    /**
     * RabbitMq
     * @return
     */
    @Override
    public String sendRabbit() {

        for (String e:list
             ) {
            MessageBuilder messageBuilder = MessageBuilder.withPayload(e);
            this.output.send(messageBuilder.build());
        }
        return "Rabbit 发送成功!";
    }

接口IMessageProvide

public interface IMessageProvide { String sendRabbit(); }

控制层 SendMessageController

@RestController
public class SendMessageController {

    @Autowired
    IMessageProvide iMessageProvide;

    /**
     * rabbitmq生产者
     * @return
     */
    @GetMapping("/sendRabbitmq")
    public String sendMessageRabbitmq(){
        return iMessageProvide.sendRabbit();
    }

}

在启动类加上注解 @EnableBinding(StreamClient.class) 后启动。


消费者

配置文件application.yaml

注意⚠️若是需要多消费者消费,则修改consumer.concurrency: 的值即可,但是创建的分区数不能小于消费者数量。

server:
  port: 8802

spring:
  application:
    name: cloud-stream-consumer
  cloud:
    stream:
      binders: #配置要绑定的rabbitmq的服务信息
        defaultRabbit: #表示定义的名称,用于bingding的整合
          type: rabbit
          enviroment:
            spring:
              rabbitmq:
                host: 127.0.0.1
                port: 5672
                username: guest
                password: guest
      bindings: #服务的整合处理
        input:
          destination: studentExchange #表示要使用的exchange的名称定义
          content-type: application/json
          group: groupA
          consumer.concurrency: 1    #设置该消费者的线程数

  rabbitmq:
    host: 127.0.0.1
    port: 5672
    username: guest
    password: guest

消费数据并打印第一条和最后条数据的时间,查看单个消费者与多消费者所消费的时间,或前往rabbitmq管理界面查看消费数据的吞吐量。

@Component
@EnableBinding(Sink.class)
public class ReceiveMessageListener {

    /**
     * rabbitmq生产者8802
     * @param message
     */
    @StreamListener(Sink.INPUT)
    public void input(String message){
        if (Integer.parseInt(message)==1 || Integer.parseInt(message)==100000) {
            System.out.println("消费者8802第"+message+"条数据消费时间:"
                    +new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SS").format(new Date()));

        }
    }
}

例如结果:

Springcloud Stream整合Rabbitmq(生产者和消费者)_第1张图片

你可能感兴趣的:(java-rabbitmq,rabbitmq,spring,cloud)