Mule消息結構

Mule消息是通過一個或多個流傳遞應用程序的數據。它由兩個主要部分組成:

消息頭(Message Header),它包含關於消息的元數據

.消息有效負載(Message Payload),它包含您的特定的業務數據。

Mule消息本身嵌入在Mule消息對象(mule message object )中。一些Mule消息對象可能包含變量(variables)、附件(attachment)和異常有效負載(exception payloads)。附件和異常有效負載不經常被使用或被操縱。

message_object

屬性和變量(properties and variables)

包含在消息頭(message header)中的元數據(metadata)由提供關於消息的有用信息的屬性組成,包含在消息對象中的變量(variables)表示消息的數據。
屬性和變量共享一種通用格式:每個屬性或變量都有一個名稱和一個值。名稱是在Mule中引用屬性或變量,其值是存儲在其中的信息。因此,這個名字就像門的鑰匙,它的值是這扇門背後的用料。
消息的屬性和變量具有特定的作用域(scopes),作用域定義並組織了屬性和變量是如何在消息的整個生命週期中使用的。屬性將元數據與消息一起發送,
以方便處理和避免當消息跨越傳輸障礙時的錯誤——通過輸入一個新的流或被傳送到另一個應用程序。

屬性有兩個主要作用域:入站和出站(inbound and outbound)

.入站屬性(inbound properties)是不可變的,由消息源自動生成,不能由用戶設置或操作。
它們包含特定於消息源的元數據,這些元數據可以防止在消息的生命週期中出現數據格式的混亂或其他處理災難。
消息僅在流的持續時間內保留其入站屬性;當消息從流中流出時,它的入站屬性不會跟隨着它(見下圖)。

.出站屬性(Outbound properties)

出站屬性是可變的, 它們是在流的過程中設置的,當消息從一個流的出站端點通過傳輸傳遞到另一個流的入站端點時,就可以成爲入站屬性。它們包含與入站屬性類似的元數據,但在消息進入流之後,將應用出站屬性。出站屬性可以由Mule自動設置,用戶可以通過手動在流中插入一個或多個transformer元素來設置它們。請注意,如果消息通過流引用而不是連接器傳遞給新的流,那麼出站屬性仍然是出站屬性,而不是轉換爲入站屬性(見下圖)


變量是關於消息的用戶定義的元數據。變量有三個範圍:

.Flow variables流變量只適用於它們存在的流。

.Session variables會話變量適用於同一應用程序中的所有流。

.Record variables記錄變量只適用於處理作爲批處理的一部分的記錄。

變量是關於消息的臨時信息,這些信息是用於處理它的應用程序所使用的,不是將消息傳遞給它的目的地。因此,變量更有可能由人來設置,而屬性更可能由系統設置和調用。但是,對於如何使用屬性和變量,並沒有嚴格的規則。

設置和使用屬性(properties)和變量(variables)

Mule包括三個消息處理程序,您可以使用它們來設置、複製或刪除消息流中的出站屬性和變量。

當您在流中包含其中一個轉換器時,Mule會添加、複製或刪除消息頭或對象的元數據。(還有第四種消息處理器:記錄變量轉換器可以在一個批處理中設置或刪除一個記錄中的變量。例如,您可能希望向消息中添加一個屬性,以便在消息中設置HTTP傳輸頭。或者,如果您的流查找與用戶相關的帳戶編號,您可能想要在消息中添加一個變量,以便將帳戶號存儲爲消息上的元數據。下面的表描述了這三個消息處理器:屬性轉換器(Property Transformer)、變量轉換器(Variable Transformer)和會話變量轉換器(Session Variable Transformer)

 

Property

Variable

Session Variable

Use

使用屬性轉換器在消息的出站範圍內設置、刪除或複製屬性。

使用變量轉換器在消息上設置或刪除一個流變量,並綁定到當前流。

使用會話變量轉換器來設置或刪除與當前消息綁定在整個生命週期中的變量,跨多個流、應用程序,甚至是服務器。

Persistence

一旦消息到達outbound-端點,出站範圍內的所有屬性都以消息的形式發送,以特定於傳輸的元數據的形式(例如,HTTP消息頭的HTTP)

變量轉換器設置的變量只對當前流進行持久化,不能跨越傳輸障礙。

使用會話變量轉換器設置的會話變量在整個消息生命週期中都存在,而不考慮傳輸障礙。

請注意,當使用支持會話的傳輸協議時,會話變量會在傳輸障礙中持續存在。


例如,下面的流在消息上設置了一個出站屬性-一個時間戳。

mule+message+structure

要訪問您在流中的消息或應用程序中不同的流中設置的屬性或變量,請使用MEL表達式。

Type

Set or Remove

Copy

Access using MEL

Outbound Property

Property Transformer

Property Transformer

messsage.outboundProperties

Inbound Property

 

 


message.inboundProperties

Session Variable


Session variable Transformer

 

 

sessionVars

Variable

Variable Transformer

Variable Transformer


flowVars

例如,如果您想根據前面在處理中添加到消息頭的時間戳屬性來路由消息,那麼可以在選擇路由器中使用表達式來訪問出站屬性使用消息。

使用message.outboundProperties 訪問時間戳屬性並計算屬性值(即消息上的時間戳)


類似地,一旦設置了會話變量,就可以使用Mule表達式中的sessionVars映射來訪問它。

例如,如果您已經設置了一個名爲“SVname”的會話變量和值“SVvalue”,那麼您可以使用表達式sessionVarsSVname來調用這個會話變量,

該變量的值爲SVvalue。訪問一個變量, 在前面的表達式中使用flowVars代替sessionVars

消息有效負載(message payload)

消息有效負載是Mule消息中最重要的部分,因爲它包含了Mule應用程序處理的數據。您可以將元數據應用到消息頭或消息對象中,以傳遞有關消息的信息,

或將其從被篡改的信息中保護出來,但是消息的核心——您正在傳輸的數據——是消息首先存在的原因。

payload並不一定和它通過流傳播的一樣。Mule流中的各種消息處理器可以通過設置、充實或將其轉換爲一種新的格式來影響payload

您還可以使用MEL表達式從一個流中的payload中提取信息。

設置一個消息的payload

使用Set payload息處理器來完全替換消息有效負載的內容。輸入一個字符串或Mule表達式,該表達式定義了Mule應該設置的新負載。

下面的示例用一個字符串來替換有效負載,該字符串會讀取”HelloMyfriend! ”



豐富一個消息的payload
在某些情況下,您可能希望調用外部資源,並使用響應來充實消息的payload,而不是替換它。爲此,
您可以使用Message Enricher範圍(或包裝器)封裝一個或多個消息處理器來執行獲取信息的任務。
一旦獲得,Mule添加或豐富了消息的payload,並使用對資源的調用結果。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章