天天看點

Mule 2.x Getting Started Guide第二部分Mule使用之使用服務

使用服務

介紹

一個服務元件是一個類、Web Service、或者其他的應用,它包含了你希望嵌入到Mule架構中的業務邏輯。例如,一個服務元件可以從使用者資料庫中添加資訊到發貨清單中,另一個服務元件可以是一個處理發貨清單的訂單執行應用程式。你可以使用現有的應用作為服務元件,也可以建立新的服務元件。

你的服務元件不需要包含Mule相關的代碼。你需要配置服務,将服務用Mule相關的配置包裝起來。服務配置指向服務元件,以及那些在服務元件間運送消息的路由器,過濾器以及轉換器。它也可以指定服務用以接收消息的入站端點和為消息發往何處定位的出站端點。服務是完成內建解決方案的主要的Mule原件。

服務元件

一個服務元件可以是任意類型的對象,包括:

l Spring bean

l POJO

l Script

l Web Service or REST call

當建立一個服務元件時,你可以使用Mule IDE,這是一個Eclipse插件,它提供了開發Mule應用的內建開發環境

你還可以使用一些預設的元件,請參照使用預設的元件。

服務配置

絕大多數配置在服務級别上進行配置。服務可以使用全局定義的端點、轉換器和過濾器或其他内部定義的元件來配置。

服務行為

當一個服務從入站端點接收到一個消息時,它處理入站消息和發送發站消息的行為由兩方面決定:

l 服務模型(預設為SEDA)

l 消息模式

服務模型決定了處理和隊列行為,而消息模型定義了入站和出站消息交換模式。

進階配置

你可以從以下方面進一步了解服務的配置:

l 事務

l 錯誤處理

l 安全(由端點配置)

配置服務

配置服務使用<service>和<model>兩個元素。每一個<service>元素描述和配置了一個Mule服務,它會提供一個單一的名稱來辨別這一服務,你可以根據需要可選地配置狀态,用于确定這一服務以及它的端點是否随Mule伺服器的啟動而啟動。(初始狀态包括啟動、停止以及暫停)。

每一個服務都可以使用下面的可選元素進行配置:

l <description>:對服務的描述;

l <inbound>:配置入站路由及其端點,入站轉換器;

l <component>:配置服務元件;

l <outbound>:配置出站路由及其端點,出站轉換器;

l <async-reply>:配置異步響應路由,用于請求/響應方式的異步消息;

l <exception-strategy>:為消息配置異常處理政策。

如果你配置了多個上述元素,注意你必須按上面書寫的順序進行一一配置。關于<service>元素及其屬性詳情參見Service Configuration Reference。

下面是一個簡單的服務配置:

下面是對這些元素進行的更加詳細的介紹。

入站

這一進制素用于配置入站端點和入站路由。端點通常接收進入系統的消息,入站路由則确定這些消息怎樣被路由。入站端點和路由在<inbound>标簽内分别進行配置。

入站端點用于接收進入的消息。一個端點就是一組簡單的訓示,指明了從哪個傳輸元件和哪個路徑或位址接收消息,當然也包括必要接收消息中要使用的轉換器,過濾器或者安全服務。你可以配置多個入站端點,每一個會從不同的傳輸元件是接收消息。更多内容參見Configuring Endpoints和Available Transports。

入站路由控制和操作一個服務接收到的消息,它是在消息被傳送到該服務的服務元件前進行處理的。通常情況下,入站路由用于在接收消息時對這些消息進行過濾,聚合或重排序。入站路由也可以用于為一個服務注冊多個入站端點。你可以将入站路由連結在一起,在消息傳送到元件前,它需要與每一個路由都比對一次。你可以配置一個catch-all-strategy用于處理不能被其他路由政策接收的消息。

入站路由不同于出站路由的地方在于,其端點是已知的(因為消息已經收到了),是以入站路由的目的在于怎樣将消息傳遞給元件。

如果沒有配置入站路由,預設情況下會使用InboundPassThroughRouter,它會簡單地将進入的消息傳送給元件。

隻比對首個路由

預設情況下,一個消息在被傳送給服務元件前,它必須要比對服務中所有的入站路由器,并被它們進行處理。如果你想配置服務,使進入的消息隻被第一個條件比對的路由器處理,你可以把<inbound>元素裡的mathcAll屬性設定為false。

需要更多關于入站路由器的資訊,可以檢視Mule Inbound Routers。

入站配置執行個體

這個例子中使用了一個元素<selective-consumer-router>來接收符合’resultcode’屬性為’success’的消息。如果消息符合這一過濾器的标準,消息就會被送到這一元件。如果消息不符合,<catch-all-strategy>就會被調用,它會通過它的端點發送該消息,這個例子中是一個叫做失敗隊列JMS隊列。

元件

<component>元素配置的服務元件,将在入站消息被入站路由器處理以後被調用。如果沒有配置元件,這一服務就僅作為一個橋(Bridge),簡單的将消息傳送到出站路由器上。

目前可用并部署到Mule中的元件如下所示:

l 一些标準元件;

l <component/>:用于Java元件;

l <pooled-component/>:用于使用池的Java元件

l <script:component/>:用于基于腳本的元件;

l <test:component>:用于測試你的服務的元件(參見[Writing Functional Tests])。

更多關于這些元件類型和配置的資訊,可以看[Components]。你可以在你的Mule模型中實作新的元件類型,并将它們用于你的配置。在Mule 2.0中,實作和使用新的非Java元件類型,并将他們配置到自定義的元件裡變得更加容易了。

出站

<outbound>元素配置出站路由器和它們的端點。因為出站路由器用于在元件處理完消息後,确定使用哪些端點來發送消息,是以出站路由器上需要配置出站端點,但并不是直接配置在<outbound>元素裡。出站路由器允許開發者為任意消息定義多個出站限制。你可以為沒有路由器接收的消息指定catch-all-strategy。更多資訊參見Configuring Endpoints和Available Transports。

比對所有路由器

預設情況下,消息隻會被符合條件的第一個出站路由器處理。如果你想讓消息被所有的路由器都處理,你要把matchAll屬性設定為true。例如,假定你總是需要為原始的儲戶發送一個存款确認,并且如果存款額大于$100,000,你需要給‘高淨值客戶管理器’發送一個通知友善其可能的随訪。在這個場景下,你可能會在<outbound>定義中設定matchAll屬性:

在這個例子中,消息總會比對第一個路由器,因為這個路由器沒有過濾器。另外,如果存款額大于$100,000,消息還會和第二個路由器比對,這時,兩個路由器都會被調用。

更多關于出站路由器的資訊,可以參考Mule Outbound Routers。

出站配置執行個體

 内容略

異步回複

這一進制素用于配置那些需要在異步的請求/回複場景中接收回複的端點和路由器。這種情況下,你通常需要在目前服務響應經過它的入站端點前需要合并來自一個遠端端點的多個響應消息。這裡有一個經典的例子,當發送出一個請求,這個請求需要多個任務并行地執行。在響應被發回請求者之前,每一個任務都必須完成執行和結果處理。需要更多的關于可以使用的異步回複路由器的資訊,請看Asynchronous Reply Routers。需要配置端點的資料,請看Configuring Endpoints。

異步回複路由器可以在請求/回複調用中聯結叉狀的任務。實際上,你可以使用在使用了異步調用的服務中使用異步回複路由器(因為當異步轉發消息時是沒有回複的)。Mule提供了聚合路由器,它可以用于聯結消息分裂元件或者接收清單路由器,在傳回回複前進行消息聚合。從Using Message Routers可以找到更多關于這些路由器的資訊。

端點指定了響應應該被轉發、進行處理的位址。路由器負責為使用者将銀行的開價聚合成一個開價。下面看一下LoanBroker配置中的入站和異步響應路由器配置:

這個配置指明了貸款中介将從vm:Loan.Requests中接收請求,并将多個請求通過出站路由轉發到不同的銀行。銀行端點用被稱為‘接收清單‘的清單進行定義,并作為出站消息的一個屬性。出站路由中一個重要的配置是<reply-to>端點,它會告訴Mule,将所有的回複路由到jms:Loan.Quotes端點,這個端點就是異步響應路由器監聽的端點。當所有的響應都後,BankQuotesResponseAggregator選擇最廉價的開價,并傳回它。然後Mule将其傳回給請求者。<reply-to>端點然後被應用到下一個調用的服務上。例如,如果服務1将消息發送給服務2處理,并且服務1有一個包含reply-to端點的出站路由,那麼,服務2将把它處理的結果發送到reply-to端點上。

響應轉換器

如果你不對響應做其他處理,僅僅需要轉換一下其消息格式,你可以在響應路由器(response-router)上配置一個轉換器屬性,而不做其他任何的路由配置。

回複

所有出站路由器可以有一個回複端點(reply-to endpoint),它定義了消息處理者處理完成消息後,消息的路由。<reply-to>端點應用于下一個被調用的元件。例如,如果元件1将消息轉發給元件2處理,元件1有一個含有<reply-to>的出站路由器,元件2會把它處理完的結果發送到<reply-to>端點上。<reply-to>端點可以是任意合法的端點URI,如果傳輸元件<reply-to>消息,它就會沿着消息方向将消息發送給下一個元件。關于傳輸器支援<reply-to>的資訊,可以參見Available Transports。

逾時

異步回複路由器逾時設定決定了Mule會在傳回結果前等待回複多久。其預設值由Mule執行個體中已配置的預設同步事件逾時值決定。你也可以為使用可選的異步回複元素中的逾時屬性為一個服務的異步回複指定單獨的逾時值。

當在所有等待的消息被收到前,路由器出現逾時異常的情況下,使用可選的failOnTimeout屬性選擇要不要抛出異常。如果設定為flase(預設值),目前消息會被傳回繼續處理。

異常處理政策

異常政策用于在處理消息的過程中出現錯誤時處理異常。你可以為服務配置異常政策。如果沒有配置異常政策,DefaultServiceExceptionStrategy将會被調用。

更多關于異常政策的資訊,參見Error Handling。

服務橋

服務元件配置在Mule 2.0中是可選的。預設使用的元件是PassThroughComponent。這個元件自動地将入站消息連接配接到出站階段,并簡單地将消息傳送到出站路由器上。如果你想将消息從一個傳輸器發送到另一個傳輸器,這種方式可以作為橋端點。

示例:讀取檔案并将它的内容發送到Jms Topic。

服務模型

Mule預設使用分階段的事件驅動架構模型(SEDA)。SEDA中,應用程式包括一個連接配接着明确的隊列上的事件驅動階段的網絡,這樣的架構保證服務可以被很好的加載,防止在需要過度的服務能力時資源會被過量使用。是以,SEDA提供了一個效率很高的隊列模型,來最大限度地提高性能和吞吐量。

參照Models,可以得到更多可選擇的模型以及怎樣實作滿足自己需要的模型。

服務消息模式

消息模式決定了消息交換模式,它用在入站和出站端點上,來保證這些端點可以配置成異步請求/響應,異步參與或者其他模式。

消息模式配置在端點上,保證多種模式都可以用在同一個服務上。更多資訊參見[Messaging Patterns]。

配置元件

内容略

使用消息路由器

消息路由器用于在系統中控制元件對事件的發送和接收。Mule定義入站路由器用于處理接收到的事件,定義了出站路由器,在事件被轉發時調用。

Mule為你的元件提供了靈活的消息路由支援。路由的特點基于企業內建模式一書描述的企業路由要求。

入站路由

當一個消息通過端點被接收到後,入站路由控制消息怎樣進入服務。下面是對入站路由的介紹和配置方法。

Pass-through Router

這個路由總是可以比對的,它簡單的将進入的消息報傳送到服務元件。沒有路由器配置的情況下,會預設使用這個路由器。

Selective Consumer

一個Selective Consumer入站路由器可以對進入的消息應用于一個或多個過濾器。如果過濾器比對,消息就會被發送到相應的元件。否則,消息會被轉發到路由器的catch-all-strategy。如果沒有配置catch-all,消息就會被忽略掉,并且系統會記錄一個警告。這個路由器的配置如下:

注意預設情況下,過濾器會在入站轉換器處理完消息後,才被調用。如果你需要在轉換器調用之前對消息執行過濾功能,你可以設定路由器的transformFirst屬性。

Idempotent Receiver

使用過濾器

過濾器指定了被路由到特定服務元件的消息必須滿足的條件。在Mule中,你可以使用多種标準的過濾器,也可以自己建立過濾器。

你可以建立全局的過濾器,然後在你的服務中引用它。全局過濾器需要一個"name"屬性,過濾器是配置在端點上的,而路由器則不是。

标準的過濾器

Mule中,你可以将以下标準過濾器使用到你的路由器中。

Payload Type Filter

Expression Filter

RegEx Filter

Wildcard Filter

Exception Type Filter

Message Property Filter

Logic Filter

後面的文章中将對此進行一一介紹。

繼續閱讀