1. 程式人生 > >RabbitMq學習筆記(二)

RabbitMq學習筆記(二)

一.訊息手動清理

RabbitMq可以實現手動清空佇列:在管理端操作;也可以在直接使用程式清空佇列。

二.queue的屬性含義
1 durable屬性含義與測試結果

若durable為true,則重啟rocketMq服務之後,佇列和原本的訊息依舊在;若durable為false,則重啟rabbitMq服務之後,佇列會被刪除。

測試過程:
1)分別建立兩個佇列:queue1:return new Queue("queue1");//durable為true
             queue2:return new Queue("queue2", false);//durable為false
2)分別向兩個佇列傳送訊息100條;
3)重啟rocketMq服務之後,發現queue1以及訊息都存在,queue2已經被刪除。
2 auto-delete屬性含義與測試結果

最後一個消費者消費完訊息以後會自動被刪除(The queue is automatically deleted when the last consumer unsubscribes.);

測試過程:
1)建立一個佇列:queue1:return new Queue("queue1", true,false,true); //auto-delete為true
2)向佇列傳送訊息100條,不啟動訊息監聽:傳送完之後,queue1和100條訊息都保持存在;
3)啟動訊息監聽:訊息被消費完成之後,queue1已經被刪除;
3 exlusive屬性含義與測試結果

服務失去連線時候,佇列就會自動被刪除(restricted to the connection.)

測試過程:
1)建立一個佇列:queue1:return new Queue("queue1", true,true,false); //exlusive為true
2)向佇列傳送訊息100條,傳送過程中會發現queue1還存在;
3)停掉服務之後,queue1已經被刪除;
三、Exchange 交換機四種類型說明
1、Direct:先匹配, 再投送.

即在繫結時設定一個路由鍵routing_key,路由鍵匹配時,才會將訊息送到queue中;

2、Topic:按規則轉發訊息(最靈活的)
    根據萬用字元轉發 *表示一個詞,#表示0或者多個詞。
3、Headers:是一個自定義匹配規則的型別.
4、Fanout:訊息廣播的模式,發給所有佇列
四、遇到的問題及解決方式(SpringBoot整合RabbitMq)
問題1:received ‘topic’ but current is ‘direct’

    2018-11-21 09:14:40.553 ERROR 3932 --- [ 127.0.0.1:5672] o.s.a.r.c.CachingConnectionFactory       : Channel shutdown: channel error; protocol method: #method<channel.close>(reply-code=406, reply-text=PRECONDITION_FAILED - inequivalent arg 'type' for exchange 'spring-boot-exchange' in vhost '/': received 'topic' but current is 'direct', class-id=40, method-id=10)

問題原因:

當前路由鍵型別與新宣告的路由鍵的繫結型別不一致。

解決方法:

重新建一個routing-key,與當前繫結型別保持一致;或者刪掉服務上本來已有的routing-key,再重新建立一個routing-key。

問題2:received ‘false’ but current is ‘true’
2018-11-21 15:13:08.345 ERROR 9256 --- [ 127.0.0.1:5672] o.s.a.r.c.CachingConnectionFactory       : Channel shutdown: channel error; protocol method: #method<channel.close>(reply-code=406, reply-text=PRECONDITION_FAILED - inequivalent arg 'durable' for exchange 'spring-boot-exchange' in vhost '/': received 'false' but current is 'true', class-id=40, method-id=10)
問題原因:

如果宣告一個已經存在的queue或exchange時,宣告的屬性(持久化、自動刪除等)必須與伺服器一致,否則會丟擲以下異常:

解決方法:

刪掉服務上本來已有的queue或者exchange,再重新建立一個queue或者exchange。