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

結尾

這幾個東西單純記錄下使用方式互相直接並沒有依賴關係。

相關文章
相關標籤/搜索