W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
為了更好地理解內(nèi)容類型協(xié)商的機(jī)制和必要性,我們以下面的消息處理程序?yàn)槔?,看一個(gè)非常簡單的用例:
@StreamListener(Processor.INPUT) @SendTo(Processor.OUTPUT) public String handle(Person person) {..}
為簡單起見,我們假設(shè)這是應(yīng)用程序中唯一的處理程序(我們假設(shè)沒有內(nèi)部管道)。
前面示例中所示的處理程序期望將Person
對象作為參數(shù),并產(chǎn)生String
類型作為輸出。為了使框架成功將傳入的Message
作為參數(shù)傳遞給此處理程序,它必須以某種方式將Message
類型的有效負(fù)載從有線格式轉(zhuǎn)換為Person
類型。換句話說,框架必須找到并應(yīng)用適當(dāng)?shù)?code class="literal" i="1884">MessageConverter。為此,該框架需要用戶提供一些指導(dǎo)。處理程序方法本身的簽名(Person
類型)已經(jīng)提供了這些指令之一。因此,從理論上講,這應(yīng)該是(并且在某些情況下是足夠的)。但是,對于大多數(shù)用例而言,為了選擇適當(dāng)?shù)?code class="literal" i="1886">MessageConverter,框架需要額外的信息。缺少的部分是contentType
。
Spring Cloud Stream提供了三種機(jī)制來定義contentType
(按優(yōu)先順序):
1.標(biāo)題:contentType
可以通過消息本身進(jìn)行通信。通過提供contentType
標(biāo)頭,您可以聲明用于查找和應(yīng)用適當(dāng)?shù)?code class="literal" i="1891">MessageConverter的內(nèi)容類型。
2.綁定:可以通過設(shè)置spring.cloud.stream.bindings.input.content-type
屬性為每個(gè)目標(biāo)綁定設(shè)置contentType
。
屬性名稱中的
input
段與目的地的實(shí)際名稱相對應(yīng)(在本例中為“輸入”)。通過這種方法,您可以在每個(gè)綁定的基礎(chǔ)上聲明用于查找和應(yīng)用適當(dāng)?shù)?/span>MessageConverter
的內(nèi)容類型。
3.默認(rèn)值:如果Message
標(biāo)頭或綁定中不存在contentType
,則使用默認(rèn)的application/json
內(nèi)容類型來查找和應(yīng)用適當(dāng)?shù)?code class="literal" i="1899">MessageConverter。
如前所述,前面的列表還演示了平局時(shí)的優(yōu)先順序。例如,標(biāo)頭提供的內(nèi)容類型優(yōu)先于任何其他內(nèi)容類型。對于按綁定設(shè)置的內(nèi)容類型也是如此,這實(shí)際上使您可以覆蓋默認(rèn)內(nèi)容類型。但是,它也提供了明智的默認(rèn)值(由社區(qū)反饋確定)。
將application/json
設(shè)置為默認(rèn)值的另一個(gè)原因是由分布式微服務(wù)體系結(jié)構(gòu)驅(qū)動(dòng)的互操作性要求,在該體系結(jié)構(gòu)中,生產(chǎn)者和使用者不僅可以在不同的JVM中運(yùn)行,而且還可以在不同的非JVM平臺(tái)上運(yùn)行。
當(dāng)非無效處理程序方法返回時(shí),如果返回值已經(jīng)是Message
,則該Message
成為有效負(fù)載。但是,當(dāng)返回值不是Message
時(shí),將使用返回值作為有效負(fù)載構(gòu)造新的Message
,同時(shí)從輸入Message
繼承標(biāo)頭減去由SpringIntegrationProperties.messageHandlerNotPropagatedHeaders
定義或過濾的標(biāo)頭。默認(rèn)情況下,僅設(shè)置一個(gè)標(biāo)頭:contentType
。這意味著新的Message
沒有設(shè)置contentType
頭,從而確保contentType
可以演進(jìn)。您始終可以選擇不從處理程序方法返回Message
的位置,在該方法中可以注入所需的任何標(biāo)頭。
如果存在內(nèi)部管道,則通過相同的轉(zhuǎn)換過程將Message
發(fā)送到下一個(gè)處理程序。但是,如果沒有內(nèi)部管道或您已經(jīng)到達(dá)內(nèi)部管道的末尾,則Message
將發(fā)送回輸出目的地。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: