SpringCloud 機(jī)械學(xué)

2023-11-27 12:01 更新

為了更好地理解內(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ā)送回輸出目的地。

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)