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: