RabbitMQ是什么?
本来想老规矩百度图镇楼的,想了想算了,自己总结吧,把自己最真实的感受写出。第一次接触到RabbitMQ,是在我刚毕业的时候,还是个愣头青,在一家外包公司傻乎乎的做CURD。有个秒杀场景,组长让我使用RabbitMQ来做延时入库,我懵逼了,完全没听说过的东西,于是去学,去用。后来在名创优品做一个用户邮箱系统有个场景又顺利用到了,所以实习生的经验积累真的很重要~
rabbit,理解为兔子,很快很快。
MQ,其实就是Message Queue (消息管道的英文缩写)。管道队列,理解成水管,先进先出,一边进另外一边出。但是里面装的不是水,是一些消息,具体是什么消息,可以看你业务需求,可以是个Map,基本类型,String,一条SQL语句,一个定时任务,序列化后的对象等等都可以。全靠自己DIY~
RabbitMQ可以干什么用?
这个问题,网上太多太多了,随便搜索一下优缺点一大堆,什么削峰填谷,什么延时加载,什么跨项目跨进程跨线程跨数据库进行数据传输。缺点就是导致项目可用性降低,MQ挂了相关服务也全挂之类的。没用过的背背就好了,用过的可能都不用背了。
安装RabbitMQ:
首先你的MACBook必须安装了brew。
然后执行:brew install rabbitmq
配环境
输入:sudo vi /etc/profile
填入:export RABBIT_HOME=/usr/local/Cellar/rabbitmq/3.7.15
export PATH= RABBIT_HOME/sbin
最后重启一下配置让它生效:source /etc/profile
启动:rabbitmq-server -detached
看下是否启动: rabbitmqctl status
有可能会出现疯狂报错(网上说是权限问题):
那就全部加个SUDO:
启动:sudo rabbitmq-server -detached
查看状态:sudo rabbitmqctl status
这样就成功了,打开浏览器输入:http://localhost:15672
看见这个可爱的兔子就是成功了:
下一步,SpringBoot集成:
依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
<version>1.5.2.RELEASE</version>
</dependency>
写个消息的发送端Service:
package com.example.demo.serivceImp;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.HashMap;
import java.util.Map;
@Service
public class RabbitMqService {
@Autowired
RabbitTemplate rabbitTemplate;
public String sendData(int id, int password) {
String channelNo = "jojo123";
Map<String,Object> jojoMap = new HashMap<>();
jojoMap.put("channelNo",channelNo);
jojoMap.put("userId",id);
jojoMap.put("password",password);
rabbitTemplate.convertAndSend("jojo_channel",null,jojoMap);
return channelNo;
}
}
写个Controller:
@Autowired
private RabbitMqService rabbitMqService;
@GetMapping("/rabbitMq")
public void rabbitMq(){
String s = rabbitMqService.sendData(1111, 22222);
System.out.println("发送出去的:"+s);
}
写个消息的消费端Service(每次有新消息在管道里就自动输出):
package com.example.demo.serivceImp;
import com.rabbitmq.client.Channel;
import org.springframework.amqp.rabbit.annotation.*;
import org.springframework.amqp.support.AmqpHeaders;
import org.springframework.messaging.handler.annotation.Headers;
import org.springframework.messaging.handler.annotation.Payload;
import org.springframework.stereotype.Component;
import java.io.IOException;
import java.util.Map;
@Component
public class RabbitAccept {
@RabbitListener(
bindings = @QueueBinding(
value = @Queue(value = "jojo_test_queue"),
exchange = @Exchange(value = "jojo_channel",type = "fanout")
)
)
@RabbitHandler
public void handle(@Payload Map<String,Object> dataMap, Channel channel, @Headers Map<String,Object> headers){
try {
System.out.println("接收到的:"+dataMap);
Long tag = (Long)headers.get(AmqpHeaders.DELIVERY_TAG);
channel.basicAck(tag,false);
} catch (IOException e) {
e.printStackTrace();
}
}
}
搞定收工!请求一下那个Controller,就可以看见:
这就证明已经发出去,然后又能从消息管道里拿回来了~这样就行啦~
再看看http://localhost:15672: