錯誤處理機制簡介
什麼是錯誤綁定
在應用系統中,異常(Exception)是經常出現的。這些異常通常分為 2 類,一類是運行時異常(Runtime Exception),這類異常通常是因為代碼缺陷造成的;另一類是業務邏輯異常 (Business Exception),這類異常通常是由於數據的不准確、不完善、應用系統無法處理造成的。
對於系統開發人員而言,運行時異常容易被捕獲並進行相應的處理,處理的方式主要有忽略、包裝後重新拋出、記錄日志等。對於業務邏輯相關的異常,開發人員很難去分析和處理,最佳的處理方式是把這些異常信息提供給應用系統的調用者,由調用者對這些業務邏輯進行相關處理。應用系統傳遞給調用者的業務邏輯錯誤不應該是一個異常類,而是與業務相關的結構化異常數據,這樣調用方不用關心服務的實現方式和編程語言,只需關注返回的數據(正確結果或者異常數據),並對這些數據進行相應的處理。另外,這些數據的格式通常是與編程語言無關的,而這正是 Websphere Adapter 的錯誤綁定(Fault Binding)特性所支持的。也就是說,錯誤綁定是 WebSphere Adapter 提供的一種與編程語言無關的處理業務邏輯異常的機制,通過此錯誤處理機制,能夠將運行時異常和業務邏輯異常進行區分,並給應用系統的調用者提供更為有意義的錯誤數據。
注:錯誤綁定機制目前只能在 WebSphere Process Server 以及 WebSphere Application Server Feature Pack 環境中工作。
錯誤綁定實現原理
錯誤綁定是 Websphere Adapter 支持的一種錯誤處理機制,用在 outbound 應用場景中。錯誤綁定具有以下幾個要素:
錯誤選擇器(Fault selector)
錯誤名稱(Fault name)
錯誤綁定類型(Fault binding type)
錯誤數據(Fault data)
當 WebSphere Adapter 遇到異常時,WebSphere Adapter 先調用錯誤選擇器判斷此異常是否為 WebSphere Adapter 支持的錯誤,如果不是,則不做處理,如果是,則調用錯誤選擇器生成對應的錯誤名字。然後根據錯誤名字找到對應的錯誤綁定類型,最後調用錯誤綁定類型生成相應的錯誤數據,並將此錯誤數據返回給調用者。圖 1 是整個錯誤綁定處理的流程圖。
圖 1. 錯誤綁定流程圖
WebSphere Adapter 錯誤綁定的配置
WebSphere Adapter 6.2 的實現已經支持錯誤綁定了,如果用戶要在自己的應用系統中使用錯誤綁定,就需要配置相應的文件— import 文件和 wsdl 文件。WebSphere Adapter 在默認情況下可以直接為用戶生成預定義好的錯誤配置,如果用戶需要使用自己定義的錯誤類型,則需要在 .import 文件與 .wsdl 文件中進行相應的配置。
在 import 文件中,首先需要配置一個錯誤選擇器(faultSelector),然後在每個 method 對應的 methodBindng 中,配置支持的 faultBinding,包括錯誤名稱和錯誤綁定類型,它的格式如下:
<faultBinding fault="fault name" faultBindingType=" fault binding type"/>
下面是 JDBC Adapter Outbound create 操作錯誤綁定的配置實例。
清單 1. 錯誤綁定 import 文件配置實例
<?xml version="1.0" encoding="UTF-8"?>
<scdl:import name="Output"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:eis="http://www.ibm.com/xmlns/prod/websphere/scdl/eis/6.0.0"
xmlns:scdl="http://www.ibm.com/xmlns/prod/websphere/scdl/6.0.0">
<interfaces> ... </interfaces>
<esbBinding xsi:type="eis:EISImportBinding"
faultSelector="com.ibm.j2ca.extension.emd.runtime.WBIFaultSelectorImpl"
dataBindingType="com.ibm.j2ca.jdbc.emd.databinding.JDBCDataBindingGenerator">
<resourceAdapter name="JDBCINConnectorApp.IBM WebSphere Adapter for JDBC"
type="com.ibm.j2ca.jdbc.JDBCResourceAdapter" version="6.2.0.2"/>
<connection type="com.ibm.j2ca.jdbc.JDBCManagedConnectionFactory"
interactionType="com.ibm.j2ca.jdbc.JDBCInteractionSpec">
<properties>
...
</properties>
</connection>
<methodBinding method="createCUSTOMER">
<faultBinding fault="INTEGRITY_CONSTRAINT_VIOLATION"
faultBindingType="com.ibm.j2ca.extension.emd.runtime.WBIFaultDataBindingImpl"/>
<faultBinding fault="MISSING_DATA"
faultBindingType="com.ibm.j2ca.extension.emd.runtime.WBIFaultDataBindingImpl"/>
<faultBinding fault="OBJECT_NOTFOUND_EXCEPTION"
faultBindingType="com.ibm.j2ca.extension.emd.runtime.WBIFaultDataBindingImpl"/>
<faultBinding fault="UNIQUECONSTRAINT_VIOLATION"
faultBindingType="com.ibm.j2ca.extension.emd.runtime.WBIFaultDataBindingImpl"/>
<interaction>
<properties>
<functionName>Create</functionName>
</properties>
</interaction>
</methodBinding>
<!-- other methodBinding -->
</esbBinding>
</scdl:import>
清單 1 中粗體部分分別是前文中提到的錯誤綁定的要素 -- 錯誤選擇器和錯誤名字,錯誤綁定類型。
在配置 wsdl 文件前,用戶首先需要准備錯誤數據。這些錯誤數據可以是用戶自己定義的,也可以是 WebSphere Adapter 提供了的默認錯誤數據。圖 2 是 WebSphere Adapter 默認提供的 RecordNotFound 錯誤業務對象定義。
圖 2.RecordNotFound 錯誤數據定義
注:WebSphere Adapter 提供了一個基礎的錯誤數據 WBIFault,其他的所有錯誤數據都繼承自此錯誤數據。
接下來,用戶需在 wsdl 文件中配置相應的錯誤數據。用戶只需根據 import 文件中 methodBinding 所支持的錯誤名稱在 wsdl 文件對應的操作(operation)中配置相應的錯誤數據。清單 2 是 JDBC Adapter Outbound wsdl 文件中 create 操作的錯誤配置實例。
清單 2.WSDL 文件錯誤數據配置實例
<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions name="JDBCOutboundInterface1.wsdl" … >
<wsdl:types>
<xsd:schema elementFormDefault="qualified"
targetNamespace="http://com/ibm/j2ca/fault/afcfault"
xmlns:tns="http://com/ibm/j2ca/fault/afcfault">
<xsd:include schemaLocation="UniqueConstraintFault.xsd"/>
<xsd:include schemaLocation="ObjectNotFoundFault.xsd"/>
<xsd:include schemaLocation="MissingDataFault.xsd"/>
<xsd:include schemaLocation="IntegrityConstraintFault.xsd"/>
</xsd:schema>
<xsd:schema elementFormDefault="qualified"
targetNamespace="http://ForDW/JDBCOutboundInterface1"
xmlns:bons5="http://com/ibm/j2ca/fault/afcfault">
<xsd:import namespace="http://com/ibm/j2ca/fault/afcfault"/>
<xsd:import
namespace="http://www.ibm.com/xmlns/prod/websphere/j2ca/jdbc/customerbg"
schemaLocation="CustomerBG.xsd"/>
<xsd:element name="createCustomerBG"> ...
</xsd:element>
<xsd:element name="createCustomerBGResponse"> ...
</xsd:element>
<xsd:element name="MissingDataFault_element" nillable="true"
type="bons5:MissingDataFault"/>
<xsd:element name="UniqueConstraintFault_element" nillable="true"
type="bons5:UniqueConstraintFault"/>
<xsd:element name="IntegrityConstraintFault_element" nillable="true"
type="bons5:IntegrityConstraintFault"/>
<xsd:element name="ObjectNotFoundFault_element" nillable="true"
type="bons5:ObjectNotFoundFault"/>
</xsd:schema>
</wsdl:types>
<!-- wsdl:message
...
</wsdl:message -->
<wsdl:portType name="JDBCOutboundInterface1">
<wsdl:operation name="createCustomerBG">
<wsdl:input message="tns:createCustomerBGRequestMsg"
name="createCustomerBGRequest"/>
<wsdl:output message="tns:createCustomerBGResponseMsg"
name="createCustomerBGResponse"/>
<wsdl:fault message="tns:createCustomerBGMissingDataFaultMsg"
name="MISSING_DATA"/>
<wsdl:fault message="tns:createCustomerBGUniqueConstraintFaultMsg"
name="UNIQUECONSTRAINT_VIOLATION"/>
<wsdl:fault message="tns:createCustomerBGIntegrityConstraintFaultMsg"
name="INTEGRITY_CONSTRAINT_VIOLATION"/>
<wsdl:fault message="tns:createCustomerBGObjectNotFoundFaultMsg"
name="OBJECT_NOTFOUND_EXCEPTION"/>
</wsdl:operation>
</wsdl:portType>
</wsdl:definitions>
WebSphere Adapter 支持的錯誤綁定
WebSphere Adapter 作為一個與各種 EIS 系統進行連接的產品,支持兩大類的產品,一類稱作 Application Adapter,用來連接諸如 SAP,Siebel,Oracle EBS 等不同的應用系統,另外一類稱為 Technology Adapter,用於連接 JDBC,Email,FTP 等標准的通用技術。各個不同的 Adapter 在其錯誤綁定上有某些相似之處。基於此種考慮,WebSphere Adapter 在其基礎實現類中定義了 5 種通用的錯誤綁定,每個 Adapter 既可以直接使用這 5 種錯誤綁定,也可以很方便的定義自己特殊的錯誤綁定。下面的章節,我們先來看一下 WebSphere Adapter 定義的 5 中通用錯誤綁定和相應的錯誤數據。
表 1. 基本錯誤綁定類型 錯誤類型名稱 錯誤類型實現類 錯誤類型業務對象 DUPLICATE_RECORD DuplicateRecordException DuplicateRecordFault MATCHES_EXCEEDED_LIMIT MatchesExceededLimitException MatchesExceededLimitFault MULTIPLE_MATCHING_RECORDS MultipleMatchingRecordsException MultipleMatchingRecordsFault RECORD_NOT_FOUND RecordNotFoundException RecordNotFoundFault MISSING_DATA MissingDataException MissingDataFault
下面是 IBM WebSphere Adapter for JDBC 所支持的錯誤綁定類型,其他 Adapter 所支持的錯誤綁定類型,本文不再一一列舉,有興趣的讀者可以在附件中找到相應 Adapter 所支持的全部錯誤綁定清單:
表 2.IBM WebSphere Adapter for JDBC 錯誤綁定定義清單 錯誤類型名稱 詳細描述 RecordNotFoundFault 執行 Retrieve,RetrieveAll,Delete,Update 操作時,如果相應的數據庫記錄不存在,JDBC Adapter 會拋出該類錯誤,指示用戶所存取的記錄並不存在,用戶可以根據相應的錯誤信息進行處理 MissingDataFault 執行 outbound 操作時,業務對象沒有填寫必須填寫的的屬性信息,JDBC Adapter 會拋出該類錯誤,例如在執行 Create 操作時,用戶沒有輸入相應的主鍵鍵值,JDBC adapter 就會拋出該錯誤提示用戶。默認情況下 Create, Delete, Update, Retrieve, ApplyChanges 和 Exists 操作時會產生該類錯誤。 IntegrityConstraintFault JDBC Adapter 單獨定義的一種錯誤。當執行 Create 操作時,如果數據庫拋出違背完整性限制的異常信息,JDBC Adapter 會拋出此類錯誤。例如,執行 Update 操作時對於子業務對象的外鍵鍵值和父業務對象對應的鍵值不能匹配時,JDBC adapter 就會拋出該錯誤 MatchesExceededLimitFault JDBC Adapter 執行 RetrieveAll 操作時,當返回的查詢結果記錄條目超過了 MaxRecords 屬性所配置的條目時,JDBC Adapter 會拋出該錯誤 MultipleMatchingRecordsFault 執行 Retrieve 或者 Update 操作時,如果有超過一條記錄符合查詢條件,JDBC Adapter 會拋出該錯誤 ObjectNotFoundFault 此錯誤類型為 JDBC adapter 單獨定義的一種錯誤。執行 Create 或者 Update 操作時,JDBC Adapter 處理 Single-cardinality 子業務對象,如果子業務對象對應的記錄在數據庫中不存在,JDBC Adapter 會拋出該錯誤 UniqueConstraintFault 此錯誤類型為 JDBC adapter 單獨定義的一種錯誤。執行 Create 或 Update 操作時,如果 JDBC Adapter 接收到 SQLException,JDBC Adapter 會拋出該錯誤
除了本文列舉了 IBM WebSphere Adapter for JDBC 預定好的錯誤類型外,用戶還可以根據自己的需求定制自己的錯誤綁定,不過這不在本文的討論范圍。下面的章節我們將通過 IBM WebSphere Adapter for JDBC 來展示一個錯誤綁定的應用實例。
錯誤綁定應用示例
下面,我們將通過 WebSphere Adapter for JDBC Adapter 的一個示例來展示錯誤綁定的應用。對於 WebSphere Adapter 而言,每個操作支持的錯誤綁定是每個 Adapter 預先定義的,並在生成服務接口的時候自動生成相應的錯誤數據類型。下圖所示的是一個 JDBC Adapter 的服務接口定義文件,可以看到,針對 Retrieve 操作,生成了 3 個不同的錯誤數據類型:
圖 3. 服務接口定義示例
關於每個操作所支持的錯誤綁定的含義,請參考上文。
除了在 WSDL 服務定義文件中定義這些錯誤數據類型外,JDBC Adapter 還會在對應的 Import 文件定義相應的錯誤綁定,見清單 3。
清單 3.Import 文件示例
<?xml version="1.0" encoding="UTF-8"?>
<scdl:import xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:EIS="http://www.ibm.com/xmlns/prod/websphere/scdl/eis/6.0.0"
xmlns:ns1="http://testJDBC1/JDBCOutboundInterface"
xmlns:scdl="http://www.ibm.com/xmlns/prod/websphere/scdl/6.0.0"
xmlns:wsdl="http://www.ibm.com/xmlns/prod/websphere/scdl/wsdl/6.0.0"
displayName="JDBCOutboundInterface" name="JDBCOutboundInterface">
<interfaces>
<interface xsi:type="wsdl:WSDLPortType" preferredInteractionStyle="sync"
portType="ns1:JDBCOutboundInterface">
<scdl:interfaceQualifier xsi:type="scdl:JoinTransaction" value="true"/>
</interface>
</interfaces>
<esbBinding xsi:type="EIS:EISImportBinding"
faultSelector="com.ibm.j2ca.extension.emd.runtime.WBIFaultSelectorImpl"
dataBindingType="com.ibm.j2ca.jdbc.emd.databinding.JDBCDataBindingGenerator">
<resourceAdapter
name="testJDBC1App.IBM WebSphere Adapter for JDBC with local transaction support"
type="com.ibm.j2ca.jdbc.JDBCResourceAdapter" version="7.0.0.0">
…
</resourceAdapter>
<connection type="com.ibm.j2ca.jdbc.JDBCManagedConnectionFactory"
interactionType="com.ibm.j2ca.jdbc.JDBCInteractionSpec">
…
</connection>
<methodBinding method="retrieveallDb2adminCustomerBG">
<faultBinding fault="MATCHES_EXCEEDED_LIMIT"
faultBindingType="com.ibm.j2ca.extension.emd.runtime.MatchingFaultDataBinding"/>
<faultBinding fault="RECORD_NOT_FOUND"
faultBindingType="com.ibm.j2ca.extension.emd.runtime.WBIFaultDataBindingImpl"/>
<interaction>
<properties>
<functionName>RetrieveAll</functionName>
</properties>
</interaction>
</methodBinding>
…
<!-- other methodBinding -->
</esbBinding>
</scdl:import>
對於應用程序的調用者而言,只需要知道 JDBC Adapter 的每個操作能夠支持哪些錯誤,並且根據返回的錯誤數據進行相應處理即可。運行時,如果 JDBC Adapter 捕獲的異常信息為一個業務邏輯異常,通過錯誤綁定機制的處理,將會返回對應的錯誤數據,調用者只需處理該錯誤數據對象即可。見下圖顯示的是返回的錯誤數據:
圖 4. 業務邏輯異常處理結果
如果運行時拋出的異常信息不是業務邏輯錯誤的話, Adapter 會直接拋出相應的異常信息,而不是錯誤數據對象。見下圖的處理結果:
圖 5. 一般異常處理結果
結束語
本文首先介紹了錯誤綁定的原理,並介紹了 WebSphere Adapter 所支持的錯誤綁定及其使用場景。最後通過 2 個例子展現了錯誤綁定在處理業務邏輯異常與運行時異常時的區別。通過本文的介紹,讀者能夠在實際的應用開發中理解錯誤綁定,並能夠靈活應用這些錯誤綁定。