程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> WebSphere >> WebSphere Adapter客戶定制的錯誤綁定

WebSphere Adapter客戶定制的錯誤綁定

編輯:WebSphere

為什麼要錯誤綁定

關於 WebSphere Adapter 錯誤綁定原理與應用,可以參加作者的另外一篇文章(鏈接如下:http://www.ibm.com/developerworks/cn /websphere/library/techarticles/0912_wuwei_adaptererror/),本文中,作者將簡單的描述一下為什麼客戶需要錯誤綁定,WebSphere Adapter 目前所支持的錯誤綁定,客戶定制的錯誤綁定的意義與實現方法。

錯誤綁定是 WebSphere Adapter 提供的一種與編程語言無關的處理業務邏輯異常的機制,通過此錯誤處理機制,能夠將運行時異常和業務邏輯異常進行區分,並給應用系統的調用者提供更為有意義的錯誤數據。

錯誤綁定的意義在於,可以提供給客戶一種機制來區分運行時異常和業務邏輯異常,用戶處理業務邏輯異常時不需要去檢查冗長的運行時異常日志,而是直接處理返回的錯誤業務對象。基於這種機制,可以大大減少用戶處理異常的代價,並且所返回的錯誤數據更加具體,更有意義。

錯誤綁定的工作機制

在本章節中,我們將用 WebSphere Adapter for JDBC 為例子,簡單回顧一下錯誤綁定的處理過程,請見下圖 1:

圖 1. 錯誤綁定流程圖

如上圖所示,當 WebSphere Adapter 遇到異常 (Exception) 時,WebSphere Adapter 先調用錯誤選擇器 (Fault Selector) 判斷此異常是否為 WebSphere Adapter 支持的錯誤,如果不是,則不做處理,如果是,則調用錯誤選擇器生成對應的錯誤名字 (Fault Name)。然後根據錯誤名字找到對應的錯誤綁定類型 (Fault Binding Type),最後調用錯誤綁定類型生成相應的錯誤數據 (Fault Data),並將此錯誤數據返回給調用者。

由此可見,用戶可以自定義錯誤選擇器來判斷什麼類型的異常應該被處理為錯誤,同時也可以自定義錯誤綁定實現在錯誤對象中放置定制的錯誤信息。

使用預定義的錯誤綁定

WebSphere Adapter 作為一個與各種 EIS 系統進行連接的產品,支持兩大類的產品,一類稱作 Application Adapter,用來連接諸如 SAP,Siebel,Oracle EBS 等不同的應用系統,另外一類稱為 Technology Adapter,用於通過 JDBC,Email,FTP 等標准與相應的系統交互。各個不同的 Adapter 在其錯誤綁定上有某些相似之處。基於此種考慮,WebSphere Adapter 在其基礎實現類中定義了 5 種通用的錯誤綁定,每個 Adapter 既可以直接使用這 5 種錯誤綁定,也可以很方便的定義自己特殊的錯誤綁定。WebSphere 基礎實現類中定義的錯誤綁定,是最常見錯誤類型,除了這 5 個錯誤綁定之外,每個 Adapter 還自己擴展了一些預定義好的錯誤綁定,來滿足自身 adapter 對於錯誤處理的需要,以 JDBC Adapter 為例,擴展了 IntegrityConstraintFault,ObjectNotFoundFault,UniqueConstraintFault 3 個錯誤綁定,用以滿足 JDBC Adapter 的錯誤處理的需要。

下表 1 列舉了 WebSphere Adapter 基礎實現類中定義的錯誤綁定的類型:

表 1. 基本錯誤綁定類型

錯誤類型名稱 錯誤類型實現類 錯誤類型業務對象 DUPLICATE_RECORD DuplicateRecordException DuplicateRecordFault MATCHES_EXCEEDED_LIMIT MatchesExceededLimitException MatchesExceededLimitFault MULTIPLE_MATCHING_RECORDS MultipleMatchingRecordsException MultipleMatchingRecordsFault RECORD_NOT_FOUND RecordNotFoundException RecordNotFoundFault MISSING_DATA MissingDataException MissingDataFault

為什麼要客戶定制的錯誤綁定

通過前面的章節讀者已經可以發現,每個 Adapter 預先定義好的錯誤綁定數量都是有限的,這樣就會帶來一個問題,WebSphere Adapter 預定義的錯誤綁定的類型不能滿足客戶的所有需求,例如:客戶在訪問數據庫時遇到 Table Locked 這個 SQL 錯誤信息,顯然屬於業務層面的異常,但是目前的 WebSphere Adapter for JDBC 就不能夠將該類型的異常按照錯誤綁定的機制進行處理,客戶需要按照一般的運行時異常進行處理,造成很大的不便。

問題在於,每個客戶所期望的錯誤綁定類型都不一致,對於 WebSphere Adapter 而言,很難預先定義好所有的錯誤綁定類型來供用戶使用,所以需要有一種機制讓客戶自己定制相應的錯誤綁定,這就是我們為什麼需要客戶定制的錯誤綁定。

如何實現客戶定制的錯誤綁定

從上面的分析可以看出,實現客戶定制的錯誤綁定所需要的工作是:

1)定制的錯誤業務對象。

2)定制錯誤選擇器。

3)定制錯誤綁定實現類

4)配置定制的錯誤選擇器,錯誤綁定,錯誤業務對象到需要該定制錯誤的功能操作上

下面的章節將以 WebSphere Adapter for JDBC 為例,實現一個用戶定制的錯誤綁定。

用戶場景中,使用 WebSphere Adapter for JDBC 支持的存儲過程業務對象從數據庫中提取數據。用戶使用的存儲過程需要訪問多張數據表,由於有並發的應用程序也在同時訪問這些數據表,因此在調用存儲過程的過程中有時候會得到“Record is already locked”這類 SQL 異常。使用 JDBC Adapter 默認提供的錯誤綁定,該類 SQL 異常不能被處理為錯誤,只能當作運行時異常處理,會導致用戶的異常處理代碼非常復雜。因此用戶需要實現自己定制的錯誤綁定,將這類 SQL 異常處理為錯誤業務對象,以簡化業務流程處理。

根據前文所述,客戶的第一個工作是定義錯誤業務對象,在這個實例中,為了簡單起見,我們新定義的錯誤業務對象直接繼承於 Adapter 基礎實現類定義的基礎錯誤業務對象,新定義的錯誤業務對象命名為 myFault,定義清單如下:

清單 1. myFault 錯誤業務對象定義

<?xml version="1.0"encoding="UTF-8"?>
 <xsd:schema targetNamespace="http://testFault"xmlns:Q1="http://com/ibm/j2ca/fault"
 xmlns:xsd="http://www.w3.org/2001/XMLSchema">
 <xsd:import namespace="http://com/ibm/j2ca/fault"schemaLocation="WBIFault.xsd"/>
 <xsd:complexType name="myFault">
  <xsd:complexContent>
   <xsd:extension base="Q1:WBIFault">
    <xsd:sequence/>
   </xsd:extension>
  </xsd:complexContent>
 </xsd:complexType>
 </xsd:schema>

圖 2. myFault 錯誤業務對象示意圖

用戶定義好錯誤業務對象之後,將錯誤業務對象直接放置在需要使用該錯誤業務對象的模塊中即可。

接下來客戶需要定制自己的錯誤選擇器,文中的錯誤選擇器命名為 myFaultSelector。錯誤選擇器需要實現 FaultSelector 接口,需要實現的方法包括 isFault, generateFaultName。其中,isFault 方法用於判斷一個異常是否為錯誤,generateFaultName 方法用來生成對應的錯誤名。在本實例的實現中,為了能夠利用 Adapter 已經定義的錯誤綁定類型,我們實現的錯誤綁定選擇器繼承自 WBIFaultSelectorImpl. WBIFaultSelectorImpl 是 Adapter 基礎實現類對於 FaultSelector 接口的實現,我們只需要擴展一些自己需要的功能就可以了,而不用重新實現所有的方法。

清單 3 是客戶定制的錯誤選擇器的具體實現:

清單 3. myFaultSelector 定義

public classmyFaultSelector extendsWBIFaultSelectorImpl {
 public
   booleanisFault(Object[] fault)
  {
    if(fault != null&& fault.length > 0)
    {
      if(fault[0] instanceofBaseFaultException)
      {
        return
   true;
      }
      else 
   if(fault[0] instanceofException)
      {  // nested exception
        Exception e = (Exception)fault[0];
        Throwable cause = e.getCause();
        while(!(cause instanceofBaseFaultException) && cause != null)
        {
          cause = cause.getCause();
        }
        if(cause != null)
        {
          return
   true;
        }
      }
 // New code for generical fault BO handling
      try{
 String excepInfo = e.getMessage();
 booleanresult = false;
Pattern p = Pattern.compile(“Record is already locked”);

  Matcher m = p.matcher(excepInfo);
 booleanresult = m.find();
 returnresult;
      } catch(Exception e) {
  e.printStackTrace();
  }
    }

    return
   false;
  }

 publicString generateFaultName(Object[] fault) {
 String faultName = super.generateFaultName(fault);
 if(faultName !=null&& faultName.equalsIgnoreCase("UNKNOWN")){
 return"myFault";
 } else{
 returnfaultName;
  }

 }
 }

至此,我們已經定制了錯誤業務對象,錯誤選擇器,接下來的步驟是需要實現定制的錯誤綁定,用於把異常中的信息放置到錯誤業務對象中。錯誤綁定實現類需要實現 FaultDataBinding 接口,在我們的實例中,我們自己定義的錯誤綁定命名為 myGenericalFaultBinding,繼承自 Adapter 基礎實現類的 WBIFaultDataBindingImpl,客戶只需要實現相應的 getDataOject 方法,將異常信息放置到錯誤業務對象中即可。下述清單是 myGenericalFaultBinding 的實現:

清單 4. myGenericalFaultBinding 定義

public classmyGenericalFaultBinding extendsWBIFaultDataBindingImpl {

  // 從異常中獲取錯誤數據 
  publicDataObject getDataObject() throwsDataBindingException {

    DataObject dataObj = null;
    BaseFaultException bfe = super.getFaultData();
    if(bfe != null){
      return
   super.getDataObject();
    } else{
  try{
  dataObj = SDOFactory.createDataObject("http://testFault", "myFault");
 //Need add code to set the exception information into the myFault business object 
  } catch(BusinessObjectDefinitionNotFoundException e) {
    e.printStackTrace();
  }
 }
  returndataObj;
  }
 }

至此,我們已經完成了錯誤業務對象,錯誤選擇器,錯誤綁定的實現工作,下面的章節將介紹如何將這些實現類和業務對象配置到 JDBC adapter 的 outbound interface 中。

在 JDBC Adapter 的 outbound Interface 中,我們需要配置如下信息:錯誤選擇器,錯誤類型,錯誤綁定實現類。請參加如下清單:

清單 5. 自定義錯誤綁定的應用實例

<?xml version="1.0"encoding="UTF-8"?>
 <scdl:import .. name="JDBCOutboundInterface">
 <interfaces>
  <interface xsi:type="wsdl:WSDLPortType"preferredInteractionStyle="sync"
  portType="ns1:JDBCOutboundInterface">
   <scdl:interfaceQualifier xsi:type="scdl:JoinTransaction"value="false"/>
   <interaction/>
  </interface>
 </interfaces>

 <esbBinding
 xsi:type="EIS:EISImportBinding"
 faultSelector="testFaultSelector"
 dataBindingType="
 com.ibm.j2ca.jdbc.emd.databinding.JDBCDataBindingGenerator">

  <resourceAdapter name="testFaultApp.IBM WebSphere Adapter for JDBC"
  type="com.ibm.j2ca.jdbc.JDBCResourceAdapter"version="7.0.0.0">
   <properties>
    <adapterID>001</adapterID>
   </properties>
  </resourceAdapter>
  <connection type="com.ibm.j2ca.jdbc.JDBCManagedConnectionFactory"
  interactionType="com.ibm.j2ca.jdbc.JDBCInteractionSpec">
   <properties>
    .... 
   </properties>
  </connection>
  .... 
  <methodBinding inDataBindingType= 
"com.ibm.xmlns.prod.websphere.j2ca.jdbc.db2adminsp_in_timestampbg.\ 
Db2adminSp_In_TimestampBGDataBinding"
  method="executeDb2adminSp_In_TimestampBG"outDataBindingType="com.ib
m.xmlns.prod.websphere.j2ca.jdbc.db2adminsp_in_timestampbg.\ 
Db2adminSp_In_TimestampBGDataBinding"
  >
   <faultBinding fault="testFault"faultBindingType="
   myGenericalFaultBinding"/>
   <interaction>
    <properties>
     <functionName>Execute</functionName>
    </properties>
   </interaction>
  </methodBinding>
 </esbBinding>
 </scdl:import>

至此,我們已經完成了一個簡單的客戶定制的錯誤綁定的例子,下面,我們可以來看一下在 WebSphere Integration Developer 中的集成測試工具來看一下運行的結果,請見下圖 :

圖 3. 自定義錯誤綁定的調用實例

由於本實例實現的相對簡單,因此我們返回的錯誤業務對象中的數據基本上是空的,真正的客戶應用場景中,可以在錯誤綁定實現中來實現將自定義的錯誤數據放置到錯誤業務對象中,來提供更好的出錯分析處理。

結束語

本文首先介紹了錯誤綁定的原理,並介紹了 WebSphere Adapter 所支持的錯誤綁定及其使用場景。最後通過 1 個例子展現了如何實現客戶定制的錯誤綁定在處理。通過本文的介紹,讀者能夠在實際的應用開發中理解錯誤綁定,實現定制的客戶錯誤綁定,充分利用錯誤綁定提供的便利性。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved