RabbitMq使用總結

RabbitMq使用總結:

一: rabbitMq相關的介紹:

鎮樓的官網:https://www.rabbitmq.com

https://www.cnblogs.com/xiangyuqi/p/8603993.html

概念介紹:https://www.jianshu.com/p/3ba4c1883c3d

RabbitMQ的基礎介紹https://www.cnblogs.com/bigberg/p/8136201.html

RabbitMQ消息確認機制之Confirm模式總結:https://blog.csdn.net/Weixiaohuai/article/details/94961012

確認機制:https://my.oschina.net/u/1860901/blog/968273/print

Spring-rabbit 說明文檔:https://my.oschina.net/u/1045177/blog/408656

RabbitMQ註解方式配置說明:https://blog.csdn.net/zh350229319/article/details/52230674/

二:項目使用總結,先來一個坑,測試環境沒問題,到了線上出問題,報下面的錯:

RabbitMQ異常注意 reply-code=404, reply-text=NOT_FOUND - no exchange 'topic' in vhost '/', class-id=50, method-id=

Caused by: com.rabbitmq.client.ShutdownSignalException: channel error; protocol method: #method<channel.close>(reply-code=404, reply-text=NOT_FOUND - no queue 'album.free.topaid.transcode.success..queue' in vhost '/', class-id=50, method-id=20)

1.看到這個報錯,第一想到的是,應該是queue沒有創建,一般測試環境都是設置的默認自動創建,仿真和線上是運維人員創建,那就找運維人員確認下,是不是創建了,創建的類型對不對,對下queue的名稱,type類型是fanout還是topic,確認幾個屬性,auto-declare="true" auto-delete="false" durable="true" exclusive="false"是否一致,一般auto-declare="true"是不配置的,其他是默認的,確認了這些都沒問題,陷入坑裏了,什麼原因那;

2.會不會是創建好的queue被服務再次重申覆蓋,或者聲明的有問題;這時候想到declared-by="admin"這個屬性,在有多個admin的情況下exchange以及queue都需要聲明是哪個管理的,原因找到了,測試和仿真沒有問題是因爲這兩個環境,多個admin地址都是同一個,線上卻是多個,在有多個地址的時候,不能確認是哪個admin管理的。

3.可能報403,406,530等,這些可以根據報錯直接看出問題,比如

530:connection error; protocol method: #method<connection.close>(reply-code=530, reply-text=NOT_ALLOWED - access to vhost '/' refused for user 'kumas', class-id=10, method-id=40)

說明:賬戶kumas沒有對 “/” 的權限,在 mq 管理頁面上添加權限即可

406:com.rabbitmq.client.AlreadyClosedException: channel is already closed due to channel error; protocol method: #method<channel.close>(reply-code=406, reply-text=PRECONDITION_FAILED - inequivalent arg 'durable' for queue 'test_data' in vhost '/': received 'true' but current is 'false', class-id=50, method-id=10

翻譯過來就是exchange的durable已經true了不能改爲false。所以使用的時候要注意如果exchange和queue的durable已經定義好了是不能更改的。除非客戶端刪掉exchange,queue然後重新啓動。

RabbitMQ Cluster 常見錯誤碼原因與解決辦法:https://www.jianshu.com/p/1c4c42ff5114

下面是一個服務裏配置的2個mq地址:

application-rabbitmq-context-v2.xml:

<util:properties id="rabbitmq2" location="classpath:rabbitmq2.properties"/>

<rabbit:connection-factory id="rabbitConnectionFactoryV2"
                           host="#{rabbitmq2['rabbit.connect.host.v2']}" port="#{rabbitmq2['rabbit.connect.port.v2']}"
                           username="#{rabbitmq2['rabbit.connect.username.v2']}"
                           password="#{rabbitmq2['rabbit.connect.password.v2']}"/>
<rabbit:admin connection-factory="rabbitConnectionFactoryV2" id="rabbitAdmin2"/>

<rabbit:template id="rabbitTemplate2" connection-factory="rabbitConnectionFactoryV2"/>

<bean id="TransCodeSuccessV2Listener" class="com.ximalaya.album.free.topiad.listener.TransCodeV2SuccessListener"/>
<!--轉碼完成消息監聽-->
<rabbit:queue id="transCodeSuccessV2Queue" name="#{rabbitmq2['album.free.topaid.queue']}" declared-by="rabbitAdmin2"/>
<rabbit:topic-exchange name="#{rabbitmq2['album.free.topaid.exchange']}" declared-by="rabbitAdmin2">
        <rabbit:exchange-arguments>
        </rabbit:exchange-arguments>
        <rabbit:bindings>
                <rabbit:binding queue="transCodeSuccessV2Queue" pattern="free_paid"/>
        </rabbit:bindings>
</rabbit:topic-exchange>

<rabbit:listener-container connection-factory="rabbitConnectionFactoryV2" acknowledge="auto">
        <rabbit:listener queues="transCodeSuccessV2Queue" ref="TransCodeSuccessV2Listener"/>
</rabbit:listener-container>

application-rabbitmq-context.xml:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:util="http://www.springframework.org/schema/util"
       xmlns:rabbit="http://www.springframework.org/schema/rabbit"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
                  http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
                  http://www.springframework.org/schema/rabbit
                  http://www.springframework.org/schema/rabbit/spring-rabbit-1.3.xsd
                  http://www.springframework.org/schema/util
                  http://www.springframework.org/schema/util/spring-util-3.0.xsd"
       default-lazy-init="false">
<util:properties id="rabbitmq" location="classpath:rabbitmq.properties"/>

<rabbit:connection-factory id="rabbitConnectionFactory"
                           host="#{rabbitmq['rabbit.connect.host']}" port="#{rabbitmq['rabbit.connect.port']}"
                           username="#{rabbitmq['rabbit.connect.username']}"
                           password="#{rabbitmq['rabbit.connect.password']}"/>
<rabbit:admin connection-factory="rabbitConnectionFactory" id="admin"/>

<rabbit:template id="rabbitTemplate" connection-factory="rabbitConnectionFactory"/>

<!--轉碼消息發送-->
<rabbit:fanout-exchange name="#{rabbitmq['album.free.topaid.transcode.exchange']}" declared-by="admin">
</rabbit:fanout-exchange>

<bean id="auditApprovedListener" class="com.ximalaya.album.free.topiad.listener.AuditApprovedListener"/>
<!--審覈通過消息監聽-->
<rabbit:queue id="auditApprovedQueue" name="#{rabbitmq['album.free.topaid.approved.queue']}" declared-by="admin"/>
<rabbit:fanout-exchange name="#{rabbitmq['album.free.topaid.approved.exchange']}" declared-by="admin">
    <rabbit:bindings>
        <rabbit:binding queue="auditApprovedQueue"/>
    </rabbit:bindings>
</rabbit:fanout-exchange>
<rabbit:listener-container connection-factory="rabbitConnectionFactory" acknowledge="auto">
    <rabbit:listener queues="auditApprovedQueue" ref="auditApprovedListener"/>
</rabbit:listener-container>

<bean id="creationListener" class="com.ximalaya.album.free.topiad.listener.CreationListener"/>
<!--創建消息監聽-->
<rabbit:queue id="createQueue" name="#{rabbitmq['album.free.topaid.create.queue']}" declared-by="admin"/>
<rabbit:fanout-exchange name="#{rabbitmq['album.free.topaid.create.exchange']}" declared-by="admin">
    <rabbit:bindings>
        <rabbit:binding queue="createQueue"/>
    </rabbit:bindings>
</rabbit:fanout-exchange>
<rabbit:listener-container connection-factory="rabbitConnectionFactory" acknowledge="auto">
    <rabbit:listener queues="createQueue" ref="creationListener"/>
</rabbit:listener-container>

<bean id="transCodeSuccessListener" class="com.ximalaya.album.free.topiad.listener.TransCodeSuccessListener"/>
<!--轉碼完成消息監聽-->
<rabbit:queue id="transCodeSuccessQueue" name="#{rabbitmq['album.free.topaid.transcode.success.queue']}" declared-by="admin"/>
<rabbit:fanout-exchange name="#{rabbitmq['album.free.topaid.transcode.success.exchange']}"  declared-by="admin">
    <rabbit:bindings>
        <rabbit:binding queue="transCodeSuccessQueue"/>
    </rabbit:bindings>
</rabbit:fanout-exchange>
<rabbit:listener-container connection-factory="rabbitConnectionFactory" acknowledge="auto">
    <rabbit:listener queues="transCodeSuccessQueue" ref="transCodeSuccessListener"/>
</rabbit:listener-container>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章