RabbitMQ是实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间件)。RabbitMQ服务器是用Erlang语言编写的,而群集和故障转移是构建在开放电信平台框架上的。全部主要的编程语言均有与代理接口通信的客户端库。html
Erlang是一种通用的面向并发的编程语言,它由瑞典电信设备制造商爱立信所辖的CS-Lab开发,目的是创造一种能够应对大规模并发活动的编程语言和运行环境。web
更多应用场景redis
RabbitMQ 就是一个高并发消息队列,当看到消息队列的时候就想到了redis也能实现消息队列呀,参考了一些其余博客发现这二者仍是有些区别的。spring
rabbitMQ与redis的区别docker
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编程
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
复制代码
spring:
rabbitmq:
host: 119.3.252.69
port: 5672
username: rabbit
password: 123456
复制代码
@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 是一个任务调度框架api
<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 是一个规范和完整的框架,用于生成、描述、调用和可视化 RESTful 风格的 Web 服务。整体目标是使客户端和文件系统做为服务器以一样的速度来更新。文件的方法,参数和模型紧密集成到服务器端的代码,容许API来始终保持同步。
做用:
<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
@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
这几个东西单纯记录下使用方式互相直接并没有依赖关系。