本篇主要介紹Mule表達式語言,Mule Expression Language,簡稱MEL。MEL是一種輕量級,在Mule ESB使用的表達式語言,可用於訪問和計算Mule Message的Payload,Property和Variable。幾乎每個Mule組件均可以使用MEL表達式。MEL表達式可以幫助開發者高效和優雅地過濾,路由,處理Mule message。關於Mule message基本概念,請參考第二篇和第三篇文章。java
Mule ESB是一個使用Java語言,基於Spring框架編寫的開源企業服務總線,其相關源代碼託管在GitHub上。企業服務總線英文Enterprise Service Bus,簡稱ESB。node
MuleESB在衆多開源的ESB中處於領先者的地位,擁有來自世界各地數十萬個開發人員,超過數百萬的下載量。MuleSoft公司也做爲開源軟件中的獨角獸,2017年在紐交所成功上市。咱們做爲MuleSoft的重要合做夥伴也參與其中,在六年多的時間裏,使用Mule ESB企業版開發,或者Mule ESB社區版開發,構建了衆多Mule ESB實施案例,幫助國內衆多的企業成功上線企業集成項目。git
咱們使用Mule ESB開發的過程當中,體會到它優秀的架構設計和高效的開發速度。同時也深感Mule ESB開發書籍,Mule ESB中文文檔資料很是稀少,因此使用8篇文章來寫基礎Mule ESB開發教程,講解如何使用Mule ESB開發。github
在Mule ESB上有不少方法能夠操做Mule Message,好比Java語言或者其餘腳本語言(好比JavaScript等)。可是MEL表達式是Mule推薦使用,在Mule應用中的一個統一和標準的方法。express
MEL的示例,這個示例在在Mule的Logger組件中使用MEL表達式獲取FlowVars。編程
從下圖能夠看到,咱們在Logger組件中使用MEL表達式,可以提供語法提示,該提示帶出了上一步設定的customerNo變量。數組
XML配置以下:安全
<flow name="mel-flow"> <http:listener config-ref="HTTP_Listener_Configuration" path="/" doc:name="HTTP"/> <set-variable variableName="customerNo" value="#[1008]" doc:name="customerNo"/> <logger message="The customerNo is #[flowVars.customerNo]" level="INFO" doc:name="Logger"/> </flow>
注意:MEL是一種表達式,和腳本語言相似,但並不相同。表達式一般用於動態獲取值或者設定值,或對數據進行簡單的操做。表達式語言和腳本語言之間在功能上存在重疊,但若是您編寫的內容很是複雜,須要的不只僅是幾行代碼,或者您須要包含條件邏輯,那麼腳本語言一般會更有用。若是簡單的獲取或設定值,調用方法或執行函數,則使用表達式則更方便。服務器
MEL表達式經常使用的使用場景大概能夠分紅三種。
#[payload]
#[message.inboundProperties.'http.query.params'.customerNo]
#[payload.callMethod(parameters)
#[xpath('//root/element')]
#[payload.amount > 2000]
#[message.inboundProperties.'http.method' == 'GET']
#[flowVars.dbResult]
使用表達式提取值,根據消息的內容,屬性決定執行流程。在下面的示例中,payload是一個Java對象,咱們根據購買類型,將訂單分發路由到不一樣的JMS消息隊列中。
<choice> <when expression="#[payload.getOrderType() == 'book']"> <jms:outbound-endpoint queue="bookQueue" /> </when> <when expression="#[payload.getOrderType() == 'music']"> <jms:outbound-endpoint queue="musicQueue" /> </when> </choice>
使用表達式提取值,並將值傳遞給Connector,以下示例就是使用MEL計算的值設定SMTP Connector的郵件標題,郵件接收人等。
<smtp:outbound-endpoint from="#[flowVars.mailFrom]" to="#[flowVars.mailTo]" subject="#[payload.mailSubject]" doc:name="SMTP"/>
若是payload是Java對象,能夠調用payload方法,獲取方法的返回值。示例就說調用calAmount方法,並打印計算出來的金額。
<logger message="#[payload.calAmount()]" />
咱們在上述的MEL表達式示例中能夠看到MEL有多個部分組成,第一部分就是上下文對象。MEL常見的上下文對象以下:
上下文對象 | 說明 |
---|---|
#[server] | 當前服務器,能夠獲取服務器的時間,JDK版本等,如#[server.dateTime],#[server.javaVersion] |
#[mule] | 當前Mule實例,能夠獲取Mule的版本,目錄等。如#[mule.version] |
#[app] | 當前Mule應用的實例,能夠獲取應用的名稱等。如#[app.name] |
#[message] | 這個是咱們最常用的對象,就說Mule message。如#[message.payload],#[message.inboundProperties.'http.query.params'.customerNo]等 |
server上下文對象的經常使用屬性:
Field | Field描述 |
---|---|
dateTime | 系統當前時間 |
host | 主機名 |
ip | 主機IP |
osName | 操做系統名稱 |
userName | 當前用戶 |
userDir | 當前用戶工做目錄 |
mule上下文對象的經常使用屬性:
Field | Field描述 |
---|---|
home | Mule Runtime的安裝目錄 |
version | Mule Runtime的版本 |
nodeId | 集羣下的本機ID |
clusterId | 集羣ID |
app上下文對象的經常使用屬性:
Field | Field描述 |
---|---|
name | Mule App應用名稱 |
workdir | Mule App工做目錄 |
message上下文對象的經常使用屬性:
Field | Field描述 |
---|---|
id | message的惟一ID |
rootId | message的根ID |
payload | message的負載 |
inboundProperties | message的inbound頭信息 |
inboundAttachments | message的inbound附件信息 |
outboundProperties | message的outbound頭信息 |
outboundAttachments | message的outbound附件信息 |
不一樣於第4點提到的上下文對象,MEL中還可使用變量,使用變量並不要求在表達式中使用上下文對象。變量是頂層的標識符。MEL中常見的變量以下:
#[flowVars.foo = sessionVars.bar]
上述的表達式的意思是,將session變量賦值給flow變量。
點語法。適用對象一般是Java Pojo。MEL中可使用點語法來訪問相關的對象屬性,一樣對象屬性的屬性也是能夠用點號來訪問的。
#[message.payload.item.name]
Null安全性訪問。Java編程中常常遇到NullPointerException錯誤,也就是說對空對象進行訪問操做會報錯。而在MEL表達式,能夠經過點語法.?來避免出錯。以下示例,即便item爲null,該表達式仍然不會報錯,它會返回null值。
#[message.payload.?item.name]
屬性名稱的轉義。若是屬性名稱有特殊字符,那麼使用點語法會遇到問題,這個時候能夠單引號進行轉義。以下示例,http.query.params是一個總體。咱們訪問這個屬性名,必須使用單引號進行轉義。
#[message.inboundProperties.'http.query.params'.customerNo]
中括號語法。若是對象是數組,或者Map,那麼可使用中括號進行訪問
#[payload[5]]
#[payload['userName']]
經常使用的操做符以下,和普通的開發語言相似。還有更多的操做符能夠查閱官方手冊。
本文同步發文於EnjoyingSoft Blogs ,CSDN,簡書
訪問EnjoyingSoft 網站,獲取更多Mule ESB 社區版 實施幫助。
歡迎轉載,但必須保留原文和此段聲明,且在文章頁面明顯位置給出原文連接,不然保留追究法律責任的權利。