共用方式為


路線入口範例運作方式

路線測試用戶端應用程式範例會建置一組 SOAP 標頭,其中包含您在用戶端應用程式視窗中使用控制項所建立的路線、從磁片載入指定的訊息檔案、將路線標頭附加至訊息,然後透過路線坡形將其提交至 ESB 進行處理。 如果路線產生回應,應用程式會收集回應,並在應用程式視窗中顯示回應。

您可以從數個範例路線組態檔中選擇,以查看使用協調流程、傳訊或兩者組合的單向和雙向案例。

為了協助您瞭解路線服務如何使用訊息中的路線資訊,下列 XML 會顯示先前範例中使用的 TwoWay-OrchTransform-OrchRoutingGroup-OrchTwoWayCustom.xml 路線設定檔。 此路線的第一個區段會指定三個服務調用步驟。

<Itinerary xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" uuid="" beginTime="" completeTime="" state="Pending" isRequestResponse="false" servicecount="0" xmlns="http://schemas.microsoft.biztalk.practices.esb.com/itinerary">  
  <BizTalkSegment interchangeId="" epmRRCorrelationToken="" receiveInstanceId="" messageId="" xmlns="" />  
  <ServiceInstance name="Microsoft.Practices.ESB.Services.Transform" type="Orchestration" state="Pending" position="0" isRequestResponse="false" xmlns="" />  
  <Services xmlns="">  
    <Service uuid="92d3b293-e6d4-44a1-b27d-c42b48aec667" beginTime="" completeTime="" name="Microsoft.Practices.ESB.Services.Transform" type="Orchestration" state="Pending" isRequestResponse="false" position="0" serviceInstanceId="" />  
  </Services>  
  <Services xmlns="">  
    <Service uuid="774488bc-e5b9-4a4e-9ae7-d25cdf23fd1c" beginTime="" completeTime="" name="Microsoft.Practices.ESB.Services.Routing" type="Orchestration" state="Pending" isRequestResponse="false" position="1" serviceInstanceId="" />  
  </Services>  
  <Services xmlns="">  
    <Service uuid="" beginTime="" completeTime="" name="ProcessAndRespond" type="Orchestration" state="Pending" isRequestResponse="true" position="2" serviceInstanceId="" />  
  </Services>  
  ...  

遵循路線中的服務叫用步驟清單,是包含解析程式的詳細資料一節 (由連接字串所代表) ,可讓路線服務找出或提供路線中所定義之每項服務的解析資訊。

  ...  
<ResolverGroups xmlns="">  
    <Resolvers serviceId="Microsoft.Practices.ESB.Services.Transform0"><![CDATA[BRE:\\Policy=ResolveMap;Version=1.0;UseMsg=False;]]></Resolvers>  
    <Resolvers serviceId="Microsoft.Practices.ESB.Services.Routing1"><![CDATA[STATIC:\\TransportType=FILE;TransportLocation=C:\Projects\Microsoft.Practices.ESB\Source\Samples\DynamicResolution\Test\Filedrop\OUt\%MessageID%.xml;Action=;EndpointConfig=;JaxRpcResponse=False;MessageExchangePattern=;TargetNamespace=;TransformType=;]]><![CDATA[UDDI3:\\ServerUrl=http://localhost/uddi;SearchQualifiers=andAllKeys;CategorySearch=;BindingKey=uddi:esb:orderfileservicev3.1;]]></Resolvers>  
    <Resolvers serviceId="ProcessAndRespond2" />  
  </ResolverGroups>  
</Itinerary>  

注意

每個< Resolvers >元素的實際內容不包含用來包裝上述清單中的行的空白字元。

以下是在先前設定的路線中定義的三個步驟:

  1. 執行 Microsoft.Practices.ESB.Services.Transform 協調流程,使用 BizTalk Business Rules Engine (BRE) ,使用 ResolverMap 原則轉換訊息。

  2. 執行 Microsoft.Practices.ESB.Services.Routing 協調流程,使用路由 Microsoft.Practices.ESB.Services.Routing1 將轉換的訊息路由傳送至多個位置。 < ResolverGroups >區段包含< 具有此識別碼的 Resolvers >元素,此識別碼會定義連接字串。

  3. 執行此範例所提供的 ProcessAndRespond 協調流程。 此協調流程的實作會以回應的形式傳送要求訊息複本給路線測試用戶端。

    完成每項服務後,服務會前進路線,並將路線中定義的下一個服務升階為目前服務實例,並將其狀態設定為 [擱置]。

注意

路線隨選範例會使用動態解析度將訊息傳送至輸出檔案夾。 這就是為什麼此範例沒有定義靜態傳送埠的原因。

以下是測試用戶端應用程式提交訊息之後所發生的事件順序:

  • OnRamp.Itinerary 接收埠會接收訊息。

  • ItineraryReceiveXml 管線會從 SOAP 標頭擷取路線、驗證並預先處理、將路線當做訊息內容屬性寫入輸入訊息,並將訊息發佈至 BizTalk 訊息方塊資料庫。

  • Microsoft.Practices.ESB.Services.Transform 服務協調流程的訂用帳戶會觸發此協調流程的叫用。 協調流程會先藉由傳遞目前訊息做為參數來擷取目前的路線步驟,如下列程式碼所示。

    itineraryStep =   itinerary.Itinerary.GetItineraryStep(InboundMessage);  
    
  • ItineraryStep物件包含目前服務實例執行的所有資訊,以及與其相關聯的任何解析程式。

  • Resolver物件是從ItineraryStep實例擷取,而 ESB Resolver Framework 是用來解析轉換對應的完整名稱,如下列程式碼所示。

    resolverDictionary =   
       Microsoft.Practices.ESB.Resolver.ResolverMgr.Resolve(InboundMessage,  
                                                            resolver);  
    
    // Set the transform type.  
    transformType = resolverDictionary.Item("Resolver.TransformType");  
    
  • Microsoft BizTalk ESB 工具組解析程式和配接器架構會從快取 (載入適當的解析程式來完成此作業,在此範例中,BizTalk 商務規則引擎解析程式) ,它會叫用 ResolverMap 原則並填入 ResolverDictionary 物件。

  • 協調流程完成之後,程式碼會呼叫 AdvanceItinerary 方法,如下列程式碼所示。

    // Call the Itinerary helper to advance to the next step.  
    itinerary.Itinerary.Advance(OutboundMessage, itineraryStep.ItineraryStep);  
    
  • 這會藉由更新其屬性,並將路線中定義的下一項服務升級為下一個要執行的服務,以提升目前的路線。 方法會將路線複製到輸出訊息中,服務會透過直接系結傳送埠發行回訊息方塊資料庫。

  • Microsoft.Practices.ESB.Services.Delivery 服務協調流程的訂用帳戶會觸發此協調流程的叫用。 此協調流程會遵循與第一個流程類似的程式,以取得目前的路線步驟。 不過,此協調流程會逐一查看 ItineraryStep 實例所傳回的解析程式集合。 針對集合中的每個解析程式,傳遞協調流程會使用 Microsoft BizTalk ESB 工具組解析程式和配接器架構來解析傳輸位置,並將其升級為傳出訊息內的內容屬性,如下列程式碼所示。

    // Move to retrieve the first resolver.  
    resolver = resolvers.Current;  
    
    // Pass the resolver configuration to the Resolver Manager   
    // for resolution.  
    resolverDictionary =  
       Microsoft.Practices.ESB.Resolver.ResolverMgr.Resolve(InboundMessage,  
                                                            resolver);  
    
    // Set the transport properties.  
    transportLocation =   
       resolverDictionary.Item("Resolver.TransportLocation");  
    transportType =   
       resolverDictionary.Item("Resolver.TransportType");  
    
    // Call the Adapter Manager to set all necessary properties.  
    Microsoft.Practices.ESB.Adapter.AdapterMgr.SetEndpoint(  
                                    resolverDictionary, DeliveryMessage);  
    
    // Set the delivery port address and type.  
    DeliveryPort(Microsoft.XLANGs.BaseTypes.Address) = transportLocation;  
    DeliveryPort(Microsoft.XLANGs.BaseTypes.TransportType) = transportType;  
    
  • ProcessAndRespond 協調流程的訂用帳戶會觸發此協調流程的調用,因為符合針對篩選運算式屬性定義的訊息內容屬性。

    (Microsoft.Practices.ESB.Itinerary.Schemas.ServiceName == :"ProcessAndRespond")   
    && Microsoft.Practices.ESB.Itinerary.Schemas.ServiceState == "Pending")  
    && (Microsoft.Practices.ESB.Itinerary.Schemas.ServiceType == "Orchestration")  
    
  • ProcessAndRespond 協調流程會前進路線,並將原始要求訊息傳回至路線測試用戶端應用程式作為回應。