RabbitMQ + Quartz +Swagger 使用记录

一、RabbitMQ概述

一、官方解释

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

Erlang是一种通用的面向并发的编程语言,它由瑞典电信设备制造商爱立信所辖的CS-Lab开发,目的是创造一种能够应对大规模并发活动的编程语言和运行环境。web

二、我的理解

一、应用场景

同步请求过程当中当遇到大规模并发时因为遇到DB吞吐瓶颈或遇到模块负载太高时,此时将会产生系统响应阻塞影响用户体验。

使用消息队列后当遇到大规模并发时直接判断库存是否足够后直接反馈成功失败信息,将耗时的DB读写操做放入消息队列中,由RabbitMQ下发消息给消息消费者异步处理。这样就避开耗时的DB操做给与用户及时的信息反馈增长用户体验。

更多应用场景redis

二、疑惑点

RabbitMQ 就是一个高并发消息队列,当看到消息队列的时候就想到了redis也能实现消息队列呀,参考了一些其余博客发现这二者仍是有些区别的。spring

rabbitMQ与redis的区别docker

三、简单使用

一、使用docker-compose 安装RabbitMQ

version: '3.1'
services:
  rabbitmq:
    restart: always
    image: rabbitmq:management
    container_name: rabbitmq
    ports:
      #服务端口
      - 5672:5672
      #web页端口
      - 15672:15672
    environment:
      RABBITMQ_DEFAULT_USER: rabbit
      RABBITMQ_DEFAULT_PASS: 123456
    volumes:
      - ./data:/var/lib/rabbitmq
复制代码

RabbitMQ web管理端地址 http:/ip:15672编程

二、spring boot 集成rabbitMQ

一、pom.xml

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-amqp</artifactId>
        </dependency>
复制代码

二、yml配置链接RabbitMQ

spring:
    rabbitmq:
        host: 119.3.252.69
        port: 5672
        username: rabbit
        password: 123456
复制代码

三、使用bean配置建立一个消息队列

@Configuration
public class RabbitMQConfig {
    /**
     * 建立一个消息队列
     * @return
     */
    @Bean
    public Queue queue(){
        //建立名称为testRabbitQueue的消息队列
        return new Queue("testRabbitQueue");
    }
}
复制代码

四、建立消息生产者

/**
 * 消息生产者
 */
@RestController
public class RabbitQMController {

    @Autowired
    private AmqpTemplate amqpTemplate;

    @RequestMapping(value = "sendMQ",method = RequestMethod.POST)
    public String sendMQ(String message){
        //将消息放入队列
        amqpTemplate.convertAndSend("testRabbitQueue", message);
        return "send"+message+"成功";
    }
}
复制代码

五、建立消息消费者

/**
 * 消息消费者
 */
@Component
@RabbitListener(queues = "testRabbitQueue")
public class RabbitMQConsumer {

    @RabbitHandler
    public void process(String message){
        System.out.println("我是消费者我要累死了这是消息内容-----"+message);
    }
}
复制代码

当消息队列中有数据时会将消息下发到各个消费者手上处理json

二、Quartz 概述

Quartz 是一个任务调度框架api

一、简单使用

一、pom.xml

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-quartz</artifactId>
      </dependency>
复制代码

二、建立定时任务

@Component
public class SendRabbitMQQuartz {
    @Autowired
    private RabbitQMController rabbitQMController;

    /**
     * 每分钟插入1000条消息
     */
    @Scheduled(cron = "0 0/1 * * * ? ")
    public void sendRabbitMQ(){
        for (int i=0 ; i<1000 ; i++){
            rabbitQMController.sendMQ("我是消息"+i);
        }
        System.out.println(new SimpleDateFormat("YYYY-MM-dd HH:mm:ss").format(new Date()));
    }
    /**
     * 每30秒打印信息
     */
    @Scheduled(cron = "0/30 * * * * ? ")
    public void printTime(){
        System.out.println(new SimpleDateFormat("YYYY-MM-dd HH:mm:ss").format(new Date()));
    }


}
复制代码

cron表达式在线生成器bash

三、启动类增长注解

@EnableScheduling服务器

四、测试效果

三、Swagger 概述

Swagger 是一个规范和完整的框架,用于生成、描述、调用和可视化 RESTful 风格的 Web 服务。整体目标是使客户端和文件系统做为服务器以一样的速度来更新。文件的方法,参数和模型紧密集成到服务器端的代码,容许API来始终保持同步。

做用:

  1. 接口的文档在线自动生成。
  2. 功能测试。

一、简单使用

一、pom.xml

<dependency>
        <groupId>io.springfox</groupId>
        <artifactId>springfox-swagger2</artifactId>
        <version>2.8.0</version>
    </dependency>
    <dependency>
        <groupId>io.springfox</groupId>
        <artifactId>springfox-swagger-ui</artifactId>
        <version>2.8.0</version>
    </dependency>
复制代码

二、启动类增长注解

@EnableSwagger2

三、建立bean配置类

@Configuration
public class Swagger2Config {
    @Bean
    public Docket createRestApi() {
        return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(apiInfo())
                .select()
                //接口所在包路径
                .apis(RequestHandlerSelectors.basePackage("com.fjhckj.springcloudrabbitmq.controller"))
                .paths(PathSelectors.any())
                .build();
    }

    private ApiInfo apiInfo() {
        return new ApiInfoBuilder()
                .title("rabbitMQ API 文档")
                .description("rabbitMQ API 接口文档")
                .version("1.0.0")
                .build();
    }
}
复制代码

四、在消息生产者接口上标注接口说明

/**
 * 消息生产者
 */
//描述类
@Api(value = "RabbitMQ消息生产者")
@RestController
public class RabbitQMController {

    @Autowired
    private AmqpTemplate amqpTemplate;


    //描述方法
    @ApiOperation(value = "消息生成rest接口")
    //描述参数
    @ApiImplicitParams({
        @ApiImplicitParam(name = "message", value = "消息内容", required = true, dataTypeClass = String.class, paramType = "String"),
    })
    @RequestMapping(value = "sendMQ",method = RequestMethod.POST)
    public String sendMQ(String message){
        amqpTemplate.convertAndSend("testRabbitQueue", message);
        return "send"+message+"成功";
    }


}
复制代码

@Api:用在类上,说明该类的做用。

@ApiOperation:注解来给API增长方法说明。

@ApiImplicitParams : 用在方法上包含一组参数说明。

@ApiImplicitParam:用来注解来给方法入参增长说明。

@ApiResponses:用于表示一组响应

@ApiResponse:用在@ApiResponses中,通常用于表达一个错误的响应信息

l   code:数字,例如400

l   message:信息,例如"请求参数没填好"

l   response:抛出异常的类   
复制代码

@ApiModel:描述一个Model的信息(通常用在请求参数没法使用@ApiImplicitParam注解进行描述的时候)

l   @ApiModelProperty:描述一个model的属性
复制代码

五、测试效果

http://ip:port/swagger-ui.html

结尾

这几个东西单纯记录下使用方式互相直接并没有依赖关系。

相关文章
相关标签/搜索