Error Handler 範例係以需要處理交易的企業想要開發錯誤處理常式的實務為基礎。這個範例示範如何使用 IBM Integration Bus 中所提供的某些特性。
銀行之類的企業要確定交易會被處理且只會處理一次, 且如果發生任何錯誤,都會有相關記錄。在 Error Handler 範例中, 您會將員工編號相關的訊息放到訊息流程中,該訊息流程會以這項資訊更新資料庫。如果您放置的是具有無效之員工編號的訊息,您就可以觀察錯誤處理常式如何運作。
Error Handler 範例會示範下列作業:
在本例中,範例中的主訊息流程會以員工編號的相關資訊更新資料庫。 錯誤處理子流程會在佇列發生處理程序錯誤的位置輸出任何訊息。 主流程中的資料庫更新作業係在交易式控制之下, 因此如果發生錯誤,且訊息係由錯誤處理子流程來處理,則和員工編號相關的資料庫更新作業就會回復而不會確定。 錯誤處理常式子流程中的佇列更新作業係位於交易式控制之外,以確保錯誤的相關資訊不會回復,因為該資訊必須確定以提供錯誤記錄。
這裡提供兩個輸入訊息,以供執行 Error Handler 範例使用:
有效的員工訊息會顯示在下列的 XML 程式碼中:
<Staff>
<StaffNumber>1</StaffNumber>
<NameInfo>
<LastName>Smith</LastName>
<FirstName>Jack</FirstName>
</NameInfo>
</Staff>
無效的員工訊息會顯示在下列的 XML 程式碼中:
<Staff>
<StaffNumber>99</StaffNumber>
<NameInfo>
<LastName>Doe</LastName>
<FirstName>Jane</FirstName>
</NameInfo>
</Staff>
下列圖解顯示主訊息流程。

下列圖解顯示錯誤處理子流程。
下表列出 Error Handler 範例中所使用的節點類型。Subflow 節點在技術上並不是節點, 而且也不在節點選用區中;Subflow 節點代表在主訊息流程中呼叫 Error_Handler.msgflow 子流程的位置。
| 節點類型 | 節點名稱 |
|---|---|
| MQInput | STAFF_IN |
| MQOutput | STAFF_FAIL; STAFF_OUT; STAFF_UPDATE_ERROR |
| Compute | Copy Message; Create Message for Output |
| Filter | Check Valid Staff Number; Check Backout Count |
| Throw | Throw; Throw to Complete Rollback |
| TryCatch | TryCatch |
| Subflow | Error_Handler |
如需相關資訊,請參閱 IBM Integration Bus 文件中的內建節點與使用子流程。
當您將有效的員工訊息放到輸入佇列時,該訊息會在節點中傳送。如果停用任何佇列,則該訊息無法遵循這個路徑。
當您將無效的員工訊息放到輸入佇列時,該訊息會在節點中傳送,如本節稍後所述。如果停用任何佇列,則該訊息無法遵循這個路徑。如需每一個節點作用為何的相關資訊,請參閱 IBM Integration Bus 文件中的內建節點。
當您使用 TryCatch 節點時,或當您將節點連接到 MQInput 節點的 Catch 端時,如果節點配置正確,您可能會假設如果呼叫捕捉路徑,則不會確定發生在該嘗試路徑上的任何處理程序。這個假設是不正確的。比方說,如果資料庫是在交易式控制之下的嘗試路徑中更新,且呼叫的捕捉路徑正常完成,則資料庫更新仍會受到確定。
本例中的需求是讀取一個訊息、更新資料庫,並將訊息寫入另一個佇列中。如果發生錯誤,就會回復資料庫更新。捕捉處理程序會以錯誤的詳細資料更新錯誤資料庫,並將原始訊息寫入失敗佇列。以程式設計方面來看,下列範例顯示發生的過程:
BEGIN (Start 'outer' unit-of-work.)
MQGET (Get message from the input queue.)
TRY
BEGIN (Start 'inner' unit-of-work.)
Update database
MQPUT (Put message onto the output queue.)
IF ERROR
ROLLBACK inner unit-of-work GO TO CATCH
ELSE
COMMIT inner and outer unit-of-work as one unit-of-work
END IF
CATCH
Send message to STAFF_UPDATE_ERROR queue
MQPUT (Put message onto the failure queue.)
COMMIT outer unit-of-work
可是,「XA 交易管理程式」和 WebSphere MQ 不支援同一應用程式中有兩層的工作單元。因此,Error Handler 範例會使用下列結構:
如需相關資訊,請參閱 IBM Integration Bus 文件中的訊息流程交易。