協調流程
協調流程 是可執行檔商務程式,可訂閱 (接收) ,並透過 MessageBox 資料庫發佈 (傳送) 訊息。 此外,協調流程可以建構新的訊息。 訊息是使用 訊息生命週期中所討論的訂用帳戶和路由基礎結構來接收。 若已為協調流程填入訂閱,則會啟動新的執行個體並傳送訊息,或者,在執行個體訂閱的狀況下,若有需要,執行個體會解除凍結,然後會傳送訊息。 當從協調流程傳送訊息時,它們會以訊息到達接收位置時的相同方式發佈至 MessageBox,同時會有適當的屬性插入至資料庫中以供路由使用。
在協調流程中建構的訊息必須放置在 MessageBox 資料庫中,並由協調流程執行個體所參考,但是它們不應該被發佈,因為它們尚未傳送。 XLANG/s 子服務會呼叫訊息代理程式 API,直接插入訊息。 這可讓協調流程引擎將訊息內文插入至 MessageBox,並讓它與正在執行的協調流程執行個體直接產生關聯。 在 MessageBox 資料庫中已建構訊息的持續性,會與協調流程中的持續點進行協調,以做為資料庫作業的其他最佳化。
在協調流程中使發佈和訂閱的行為似乎不同的概念是繫結。 協調流程連接埠是描述互動的邏輯連接埠。 您必須將這些邏輯連接埠繫結至實體連接埠,如此一來訊息才會傳送,不過這個繫結程序只不過是設定訊息路由的訂閱。
有四個基本選項可以繫結這些連接埠:
立即指定 (直接在協調流程中指定連接埠)
稍後指定 (在部署期間指定連接埠)
使用動態傳送埠,其中位址是以協調流程程式碼所設定
從協調流程建立直接繫結到 MessageBox 資料庫或另一個協調流程
部署協調流程
若繫結是在設計期間指定,則在部署協調流程時,會建立符合在協調流程中設定之參數的實體連接埠。 若繫結是在部署期間設定,則符合邏輯連接埠需求的任何連接埠,都可以繫結到協調流程連接埠。 至於動態繫結,選擇 [立即指定] 選項即會建立實體連接埠,不過這個連接埠是未設定位址資訊的動態傳送埠。
常令人混淆的概念是,當協調流程中的傳送埠繫結到實體傳送埠時,並無法阻止訊息傳送到其他訂閱者。 也就是說,若另一個傳送埠透過它的篩選條件,訂閱要傳送到繫結連接埠的訊息,那麼這兩個傳送埠都會接收到該訊息。 繫結只會建立訂閱,如此一來,從協調流程傳送的訊息永遠都會符合繫結傳送埠的準則。 同樣地,系結至接收埠的協調流程埠會根據訊息類型和接收埠識別碼建立適當的訂用帳戶。 訂用帳戶可確保傳入和移出協調流程的訊息會傳遞至系結埠,但訊息仍會經歷稍早所述的相同發佈和訂閱機制。
最有可能誤解、濫用或未充分使用的繫結選項是 [直接繫結] 選項。 直接繫結可以讓協調流程以各種路由屬性,將訊息發佈到 MessageBox 資料庫,例如,訊息是由接收位置所發佈。 在簡單的直接傳訊中,訊息會發佈到 MessageBox,而其升級屬性會像任何其他接收到 BizTalk Server 中的已發佈訊息般地路由。 這可讓任何訂閱者接收此訊息,但要求至少有一個訂閱者存在,否則協調流程會收到路由失敗錯誤。
直接繫結的另一個選項是,使用自我相互關聯的連接埠。 自我相互關聯的連接埠會建立唯一相互關聯 Token,並使用該 Token 單獨在執行個體之間相互關聯訊息。 自我相互關聯的連接埠最常見的用途,就是呼叫或啟動在連接埠參數中傳遞的協調流程。 在呼叫的協調流程中,可以使用連接埠來傳送訊息,不過在呼叫協調流程中相同的連接埠也可以用來接收訊息。 因為連接埠有一個唯一的相互關聯 Token,訊息會路由回到呼叫的協調流程。 自我相互關聯的連接埠就像協調流程執行個體之間的私用通訊通道。
最後的選項是在呼叫的協調流程和被呼叫的協調流程中使用夥伴協調流程,而連接埠是使用相同的共用連接埠類型所設定的,並在連接埠組態中選取相同的連接埠。 例如,在 Orch1 和 Orch2 中會選取 Orch2.MyDirectPort。 這個繫結類型會根據傳送的協調流程類型、連接埠名稱和作業名稱,來設定接收協調流程的訂閱。 這可再次確保訊息會傳送到正確的執行個體。
所有的直接傳訊選項都會使用基礎發佈與訂閱模型。 這些選項之間的差異在於屬性中,屬性是用來建立訂閱和遞送,並在有使用時協助解決。
在協調流程中使用直接繫結連接埠常遇到的問題就是,協調流程可能會發佈它本身也訂閱的訊息。 例如,協調流程是設定來由 PurchaseOrder 訊息所啟動。 這個協調流程會使用直接連接埠,將 PurchaseOrder 訊息發佈到 MessageBox。 不過,除了如預期般地接收訊息以外,另一個協調流程的執行個體也會啟動,因為它也有訂閱 PurchaseOrder 訊息。 處理會進入無止盡的迴圈,而開發人員可能需要一段時間才能弄清楚發生什麼事。
Correlation
協調流程中的相互關聯是將相關訊息接收到相同執行中協調流程實例的機制。 在「協調流程設計師」中,開發人員會遵循下列一般步驟來使用相互關聯:
定義包含用於相關訊息之升級屬性的相互關聯類型。
定義剛定義之相互關聯類型執行個體的相互關聯集。
對於傳送埠和接收埠,指定它們是否起始或遵循指定的相互關聯集。
在起始相互關聯集之後,執行個體訂閱會開始執行,而此為所有遵循此相互關聯集來接收訊息的那些連接埠而建立訂閱的時機。 因為相互關聯類型會定義即將用於相互關聯的屬性,協調流程引擎可以從由起始動作所傳送或接收的訊息中擷取這些屬性。 接著,這些值會用來定義所有剩餘動作的訂閱,而這些動作會遵循這個相互關聯集。
BizTalk Server 所接收並計劃用於相互關聯中的訊息,有其正確定義的升級屬性並會升級至訊息內容,這是很重要的。 管線中的解譯器元件會在開始接收到訊息時擷取值,而大部分的屬性會在此時升級。 基於這個原因,就不可能使用 PassThrough 接收管線,來接收必須相互關聯至協調流程之執行中執行個體的訊息。 當您使用 SOAP 接收配接器來接收相互關聯訊息時就會發生這個問題,因為在使用「Web 服務發佈精靈」時,PassThrough 管線就是接收管線的預設值。