消息沒有聲明content_type屬性,致使獲取數據時失敗
生產端用PHP語言開發,沒有聲明屬性的content_type爲text/plain,那麼AMQP代理在底層就會默認將其視爲字節數組。
消費端是由Java進行開發,由於沒有聲明content_type,Java開發的應用程序框架可能就將這個payload視爲字節數組去處理,顯然就會出錯了。由於以前的約定是string格式,而不是字節數組。
正確的作法應該在生產者投遞消息的時候,加上消息屬性「content_type」,並聲明爲text/plainweb
$message = new AMQPMessage($this->body, ['content_type' => 'text/plain', 'delivery_mode' => 2]); $this->channel->basic_publish($message, $this->bindings[$this->action]['exchangeName']);
其實加上這個'content_type' => 'text/plain'
,應該就是讓PHP告訴rabbitmq,以字符串
的格式去存儲消息,這樣Java端的底層框架才能將數據正確轉換爲有效的字符串去處理,不然默認當成字節數組
處理。數組
(固然這個得看Java程序使用的框架,可能部分框架接口會把數據格式預處理成字符串,有些可能處理成字節數組,我猜最原始的形式也是字節數組)app
可能不少時候會忽略掉這個content_type,只記得把消息定義成持久化。由於單純考慮PHP生產,PHP消費的狀況不須要處理,多是PHP底層的框架就已經實現了(可能AMQP擴展包就實現把payload默認轉爲字符串,你也能夠看到在MQ管控臺裏get message的時候,會有個「Encoding: auto string/base64」的字樣)。框架
因此涉及多系統的開發的時候(尤爲多種不一樣程序語言),務一定義有效負載
的content_type
屬性。其實涉及數據通訊交互的場景裏,都須要聲明這樣的一種契約,養成一個良好的習慣。post
在這裏也瞭解一下有效負載。首先要知道AMQPMessage消息包括兩部分,1消息屬性 2有效負載。可類比http請求頭和請求體理解。學習
列的是PHP版本的AMQP包定義屬性名,其餘程序語言可能定義不同,可是在AMQP的範疇裏是一致的)
測試
'content_type' => 'shortstr', 'content_encoding' => 'shortstr', 'application_headers' => 'table_object', # 即web UI管控臺裏顯示的header 'delivery_mode' => 'octet', 'priority' => 'octet', 'correlation_id' => 'shortstr', 'reply_to' => 'shortstr', 'expiration' => 'shortstr', 'message_id' => 'shortstr', 'timestamp' => 'timestamp', 'type' => 'shortstr', 'user_id' => 'shortstr', 'app_id' => 'shortstr', 'cluster_id' => 'shortstr',
(即web UI管控臺裏顯示的payload),其實就是消息體的組成部分,可是在AMQP裏面它不叫body,叫payload,但你能夠理解爲是消息體的意思。
this
AMQP代理將其視爲不透明的字節數組(byte[]),也就是AMQP代理不會檢查或者修改消息的有效負載。 AMQP消息可能只包含屬性而沒有有效負載,可能只有有效負載而沒有屬性,或者二者都沒有,都是有可能的。 通常當沒有設定content_type屬性時,底層程序處理有效負載的默認類型應該就是字節數組(推斷,沒有真實測試驗證)。 一般會使用序列化格式(如JSON,Thrift,Protocol Buffers和MessagePack)來序列化和結構化數據, 以便將其做爲消息有效負載發佈。在通常約定下,消息屬性中的Content type和Content encoding通常能夠代表其序列化的方式。 通常開發程序應用時會把生產者和消費者解耦開來,這裏面可能牽涉到同一種程序語言和不一樣程序語言的問題。 有可能生產者是PHP開發,消費者程序由Java開發、Python開發等。這個時候聲明消息的Content_type就尤其重要了。 這是一種契約,當發佈消息沒有對消息內容進行描述時,應用程序會傾向使用一種隱式契約去處理,這可能就會致使錯誤的產生。
https://www.jianshu.com/p/48c57d3a6acd https://juejin.im/post/5e3e1e54518825496452a31e https://blog.csdn.net/Sadlay/article/details/86716028?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task
寫的都是一些本身在開發過程遇到的問題,絕非官方確切解釋,有不對的地方歡迎指正並討論,互相學習互相進步,纔是目的。