SpringBoot從零整合RabbitMQ

今天簡單的搭建了RabbitMQ環(huán)境奥此,并整合了SpringBoot,中間遇到了許多坑雁比,總算搭建成功了稚虎。

RabbitMQ介紹

MQ全稱為Message Queue, 消息隊(duì)列(MQ)是一種應(yīng)用程序?qū)?yīng)用程序的通信方法。應(yīng)用程序通過讀寫出入隊(duì)列的消息(針對應(yīng)用程序的數(shù)據(jù))來通信偎捎,而無需專用連接來鏈接它們蠢终。消息傳遞指的是程序之間通過在消息中發(fā)送數(shù)據(jù)進(jìn)行通信,而不是通過直接調(diào)用彼此來通信茴她,直接調(diào)用通常是用于諸如遠(yuǎn)程過程調(diào)用的技術(shù)寻拂。排隊(duì)指的是應(yīng)用程序通過 隊(duì)列來通信。隊(duì)列的使用除去了接收和發(fā)送應(yīng)用程序同時(shí)執(zhí)行的要求丈牢。RabbitMQ是消息中間件的一種,消息中間件即分布式系統(tǒng)中完成消息的發(fā)送和接收的基礎(chǔ)軟件.這些軟件有很多,包括ActiveMQ(apache公司的),RocketMQ(阿里巴巴公司的,現(xiàn)已經(jīng)轉(zhuǎn)讓給apache).

環(huán)境搭建

安裝RabbitMQ需要安裝Erlang開發(fā)環(huán)境祭钉,這一步是最坑的,因?yàn)榘姹締栴}己沛,Erlang可能不兼容RabbiMQ慌核,博主嘗試了許多版本終于安裝成功。相應(yīng)的版本對應(yīng)關(guān)系看這里泛粹。博主使用的rabbimq版本為3.7.9遂铡,Erlang版本為21.0.1。

安裝Erlang

官網(wǎng)或者下載博主的安裝包提取碼a0a2晶姊,下載完一步一步next就行扒接,然后配置環(huán)境變量ERL_HOME,變量值D:\Program Files\erl10.0.1(你的安裝路徑)们衙,添加到path%ERL_HOME%\bin钾怔。打開控制臺輸入erl:

image.png
說明安裝成功

安裝rabbitmq

官網(wǎng)或者下載博主的安裝包提取碼8ozw,下載完安裝蒙挑,一步步next下來就行宗侦。切換到安裝目錄的sbin目錄下,啟動(dòng)rabbitmq-server.bat忆蚀,

image.png
啟動(dòng)成功后打開http://localhost:15672矾利,輸入用戶名guest密碼guest登入管理臺。

創(chuàng)建消息生產(chǎn)者

新建SpringBoot項(xiàng)目rabbitmq-producer馋袜,添加依賴

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-amqp</artifactId>
        </dependency>

修改application.yml配置文件

server:
  port: 8081
spring:
  rabbitmq:
    host: localhost
    port: 5672
    username: guest
    password: guest

新建配置類ProducerConf

import com.rabbitmq.client.impl.AMQImpl.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class ProducerConf {

    @Bean
    public Queue queue (){
        return new Queue();
    }
}

創(chuàng)建一個(gè)發(fā)消息的業(yè)務(wù)HelloService

import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class HelloService {

    @Autowired
    private AmqpTemplate template;

    public void send () {
        template.convertAndSend("queue","hey, boys ^_^");
    }

}

再創(chuàng)建一個(gè)運(yùn)行發(fā)消息的線程

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.stereotype.Component;

@Component
public class HelloServiceRunner implements ApplicationRunner {

    @Autowired
    private HelloService service;

    @Override
    public void run(ApplicationArguments args) throws Exception {
        new Thread(() -> {
            while (true) {
                service.send();
                try {
                    Thread.sleep(5000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }).start();
    }
}

消息的生產(chǎn)者就寫好了

創(chuàng)建消息消費(fèi)者

同樣新建SpringBoot項(xiàng)目rabbitmq-customer男旗,配置文件

server:
  port: 8082
spring:
  rabbitmq:
    host: localhost
    port: 5672
    username: guest
    password: guest

創(chuàng)建HelleService的接收者HelloServiceReceive

import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

@Component
public class HelloServiceReceive {

    @RabbitListener(queues="queue")    //監(jiān)聽器監(jiān)聽指定的Queue
    public void process(String str) {
        System.out.println("Receive:"+str);
    }
}

啟動(dòng)customer會發(fā)現(xiàn)報(bào)錯(cuò):

org.springframework.amqp.rabbit.listener.BlockingQueueConsumer$DeclarationException: Failed to declare queue(s):[queue]
    at org.springframework.amqp.rabbit.listener.BlockingQueueConsumer.attemptPassiveDeclarations(BlockingQueueConsumer.java:710) [spring-rabbit-2.1.4.RELEASE.jar:2.1.4.RELEASE]
    at org.springframework.amqp.rabbit.listener.BlockingQueueConsumer.passiveDeclarations(BlockingQueueConsumer.java:594) [spring-rabbit-2.1.4.RELEASE.jar:2.1.4.RELEASE]
    at org.springframework.amqp.rabbit.listener.BlockingQueueConsumer.start(BlockingQueueConsumer.java:581) [spring-rabbit-2.1.4.RELEASE.jar:2.1.4.RELEASE]
    at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer$AsyncMessageProcessingConsumer.initialize(SimpleMessageListenerContainer.java:1196) [spring-rabbit-2.1.4.RELEASE.jar:2.1.4.RELEASE]
    at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer$AsyncMessageProcessingConsumer.run(SimpleMessageListenerContainer.java:1041) [spring-rabbit-2.1.4.RELEASE.jar:2.1.4.RELEASE]
    at java.lang.Thread.run(Thread.java:748) [na:1.8.0_201]
Caused by: java.io.IOException: null
    at com.rabbitmq.client.impl.AMQChannel.wrap(AMQChannel.java:126) ~[amqp-client-5.4.3.jar:5.4.3]
    at com.rabbitmq.client.impl.AMQChannel.wrap(AMQChannel.java:122) ~[amqp-client-5.4.3.jar:5.4.3]
    at com.rabbitmq.client.impl.AMQChannel.exnWrappingRpc(AMQChannel.java:144) ~[amqp-client-5.4.3.jar:5.4.3]
    at com.rabbitmq.client.impl.ChannelN.queueDeclarePassive(ChannelN.java:1006) ~[amqp-client-5.4.3.jar:5.4.3]
    at com.rabbitmq.client.impl.ChannelN.queueDeclarePassive(ChannelN.java:52) ~[amqp-client-5.4.3.jar:5.4.3]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_201]
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_201]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_201]
    at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_201]
    at org.springframework.amqp.rabbit.connection.CachingConnectionFactory$CachedChannelInvocationHandler.invoke(CachingConnectionFactory.java:1110) ~[spring-rabbit-2.1.4.RELEASE.jar:2.1.4.RELEASE]
    at com.sun.proxy.$Proxy64.queueDeclarePassive(Unknown Source) ~[na:na]
    at org.springframework.amqp.rabbit.listener.BlockingQueueConsumer.attemptPassiveDeclarations(BlockingQueueConsumer.java:689) [spring-rabbit-2.1.4.RELEASE.jar:2.1.4.RELEASE]
    ... 5 common frames omitted

我們要先去管理端添加一個(gè)隊(duì)列,隊(duì)列名字要與監(jiān)聽器指定的相同


image.png

再次啟動(dòng)customer和proucer欣鳖,會發(fā)現(xiàn)customer接收到了producer發(fā)送的消息:
image.png

說明整合成功了
這只是一個(gè)簡單的demo察皇,rabbitmq還有許多功能和特性待我去研究。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末泽台,一起剝皮案震驚了整個(gè)濱河市什荣,隨后出現(xiàn)的幾起案子矾缓,更是在濱河造成了極大的恐慌,老刑警劉巖稻爬,帶你破解...
    沈念sama閱讀 219,490評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件嗜闻,死亡現(xiàn)場離奇詭異,居然都是意外死亡因篇,警方通過查閱死者的電腦和手機(jī)泞辐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來竞滓,“玉大人咐吼,你說我怎么就攤上這事∩逃樱” “怎么了锯茄?”我有些...
    開封第一講書人閱讀 165,830評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長茶没。 經(jīng)常有香客問我肌幽,道長,這世上最難降的妖魔是什么抓半? 我笑而不...
    開封第一講書人閱讀 58,957評論 1 295
  • 正文 為了忘掉前任喂急,我火速辦了婚禮,結(jié)果婚禮上笛求,老公的妹妹穿的比我還像新娘廊移。我一直安慰自己,他們只是感情好探入,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,974評論 6 393
  • 文/花漫 我一把揭開白布狡孔。 她就那樣靜靜地躺著,像睡著了一般蜂嗽。 火紅的嫁衣襯著肌膚如雪苗膝。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,754評論 1 307
  • 那天植旧,我揣著相機(jī)與錄音辱揭,去河邊找鬼。 笑死病附,一個(gè)胖子當(dāng)著我的面吹牛问窃,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播胖喳,決...
    沈念sama閱讀 40,464評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼贮竟!你這毒婦竟也來了丽焊?” 一聲冷哼從身側(cè)響起较剃,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎技健,沒想到半個(gè)月后写穴,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,847評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡雌贱,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,995評論 3 338
  • 正文 我和宋清朗相戀三年啊送,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片欣孤。...
    茶點(diǎn)故事閱讀 40,137評論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡馋没,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出降传,到底是詐尸還是另有隱情篷朵,我是刑警寧澤,帶...
    沈念sama閱讀 35,819評論 5 346
  • 正文 年R本政府宣布婆排,位于F島的核電站声旺,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏段只。R本人自食惡果不足惜腮猖,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,482評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望赞枕。 院中可真熱鬧澈缺,春花似錦、人聲如沸鹦赎。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽古话。三九已至雏吭,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間陪踩,已是汗流浹背杖们。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留肩狂,地道東北人摘完。 一個(gè)月前我還...
    沈念sama閱讀 48,409評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像傻谁,于是被迫代替她去往敵國和親孝治。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,086評論 2 355