gembin

          OSGi, Eclipse Equinox, ECF, Virgo, Gemini, Apache Felix, Karaf, Aires, Camel, Eclipse RCP

          HBase, Hadoop, ZooKeeper, Cassandra

          Flex4, AS3, Swiz framework, GraniteDS, BlazeDS etc.

          There is nothing that software can't fix. Unfortunately, there is also nothing that software can't completely fuck up. That gap is called talent.

          About Me

           

          用于Java的SCA客戶機(jī)和實現(xiàn)模型

           SCA Java 實現(xiàn)模型提供了用于在 Java  中實現(xiàn) SCA 組件的框架。組件實現(xiàn)可以提供服務(wù),也可以充當(dāng)其他服務(wù)的客戶機(jī)。本文將說明 SCA Java 組件實現(xiàn)和非 SCA Java 組件實現(xiàn)可以如何獲得對服務(wù)的訪問和調(diào)用服務(wù)方法。在本文中,所有元數(shù)據(jù)都使用 Java 2 Standard Edition (J2SE) 5 提供的 Annotation 功能定義。不過,SCA 服務(wù)客戶機(jī)和組件實現(xiàn)也可使用 J2SE 1.4。

            基本組件實現(xiàn)模型

            此模型描述本地或遠(yuǎn)程服務(wù)的實現(xiàn)以及特定于實現(xiàn)的配置屬性。

            實現(xiàn)服務(wù)

            服務(wù)使用接口表示,而接口則是使用以下方法之一進(jìn)行定義的:

          • Java 接口(SCA 的首選方式)
          • Java 類
          • 從 Web 服務(wù)描述語言(Web Services Description Language,WSDL)端口類型生成的 Java 接口

            Java 類組件實現(xiàn)會實現(xiàn)服務(wù)接口定義的所有操作,它使用 @Service Annotation 來指定服務(wù)通過使用 Java 實現(xiàn)而實現(xiàn)的服務(wù)接口。旨在用作服務(wù)實現(xiàn)的類并不必具有 @Service Annotation。@Service Annotation 具有兩個特性:

          • Interfaces——此值是應(yīng)該由其組件作為服務(wù)公開的接口或類對象的值。
          • Value——僅在提供單個服務(wù)接口時的快捷方式。沒有特性的 @Service 沒有意義。

            以下代碼片段顯示了名為 PayrollDataService 的 Java 服務(wù)接口和名為 PayrollDataServiceImpl 的 Java 接口的 Java 實現(xiàn)類。

            清單 1. Java 服務(wù)接口

          package services.payrolldata;
          public interface PayrollDataService {
          float getBasic(String employeeID);
          float getvariablePay(String employeeID);
          float getHRA(String employeeID);
          float getProfessionalTax(String employeeID);
          float getNetPay(String employeeID);

            清單 2. Java 服務(wù)組件實現(xiàn)

          package services.payrolldata;
          Import org.osoa.sca.annotations.*;
          @Service(PayrollDataService.class)
          public class PayrollDataServiceImp implements PayrollDataService {
          public float getBasic(String employeeID){ . . . }
          public float getVariablePay(String employeeID){ . . . }
          public float getHRA(String employeeID){  . . . }
          float getProfessionalTax(String employeeID){  . . . }
          public float getNetPay(String employeeID){  . . . }
          }

          如果在 Java 實現(xiàn)類中,服務(wù)接口由類本身定義,則上述代碼中的 @Service Annotation 將替換為 @Service(PayrollDataServiceImp.class)。下面將說明此組件實現(xiàn)的組件類型,如清單 3 中所示。

            清單 3. 組件類型

          <!--<?xml version="1.0" encoding="ASCII"?>
          <componentType xmlns=http://www.osoa.org/xmlns/sca/0.9>
          <service name="PayrollDataService">
          <interface.java interface="services.payrolldata. PayrollDataService"/>
          </service>
          </componentType> -->

          使用了接口的子類來提供具有相同接口的兩個服務(wù)。@Service Annotation 同時列出了這兩個接口。

            實現(xiàn)遠(yuǎn)程服務(wù)

            通過入口點發(fā)布遠(yuǎn)程服務(wù),以提供訪問外部組件的方法。為了定義遠(yuǎn)程服務(wù),將在服務(wù)的 Java 接口中添加 @Remotable Annotation。接口不由 Java 類定義的服務(wù)不是遠(yuǎn)程服務(wù)。從 WSDL 端口類型生成的 Java 接口是遠(yuǎn)程接口。

            以下將對帶 @Remotable Annotation 的遠(yuǎn)程服務(wù)的 Java 接口進(jìn)行說明:

            清單 4. 帶 @Remotable Annotation 的遠(yuǎn)程服務(wù)的 Java 接口

          package services.payroll;
          import org.osoa.sca.annotations.Remotable;
          @Remotable
          public interface PayrollService{
          public PayrollStatement getPayrollStatement(String employeeID);

            下一個代碼片段顯示了 PayrollStatement Java 接口。

            清單 5. PayrollStatement Java 接口

          package services.payroll;
          import java.util.List;
          public interface PayrollStatement {
          List getPayrollDetails();
          float getNetPay();
          }

            遠(yuǎn)程服務(wù)使用封送技術(shù)來交換復(fù)雜數(shù)據(jù)類型。在使用 Web 服務(wù)綁定時,會將服務(wù)數(shù)據(jù)對象 (Service Data Object) 或 JAXB 數(shù)據(jù)類型作為參數(shù)傳遞。遠(yuǎn)程服務(wù)使用按值數(shù)據(jù)交換語義。

            遠(yuǎn)程服務(wù)的實現(xiàn)上的 @AllowPassByReference Annotation 用于聲明它是否允許在對其進(jìn)行調(diào)用時通過引用數(shù)據(jù)交換語義進(jìn)行傳遞。

            以下代碼片段顯示了實現(xiàn)遠(yuǎn)程服務(wù)并允許通過引用傳遞的 Java 組件實現(xiàn)。

            清單 6. 具有遠(yuǎn)程服務(wù)和允許通過引用傳遞的 Java 組件實現(xiàn)

          package services.payrolldata;
          Import org.osoa.sca.annotations.*;
          @Service(PayrollDataService.class)
          @AllowsPassByReference
          public class PayrollDataServiceImp implements PayrollDataService {
                 . . . .
          }

          實現(xiàn)本地服務(wù)

            本地服務(wù)僅能由屬于相同模塊的客戶機(jī)調(diào)用。Java 本地服務(wù)接口是在不使用 @Remotable Annotation 的情況下定義的。

            以下代碼片段顯示了本地服務(wù)的 Java 接口。

            清單 7. 本地服務(wù)的 Java 接口

          package services.payrolldata;
          public interface PayrollDataService {
          float getBasic(String employeeID);
          float getvariablePay(String employeeID);
          float getHRA(String employeeID);
          float getProfessionalTax(String employeeID);
          float getNetPay(String employeeID);
          }

            本地服務(wù)的調(diào)用的數(shù)據(jù)交換語義是以引用為基礎(chǔ)的,其中,客戶機(jī)或服務(wù)提供者會看到對參數(shù)的更改。

            實現(xiàn)有狀態(tài)資源模式

            確定了范圍的服務(wù)通過在服務(wù)的接口定義或服務(wù)類上使用 @Scope Annotation 加以表示。@Scope Annotation 具有一個參數(shù),即 value,其值為范圍的名稱。

            以下是當(dāng)前支持的范圍值:

          • Stateless(缺省)——每個請求分開處理。Java 實例可以從服務(wù)實例池獲得。
          • request——對于在處理遠(yuǎn)程服務(wù)請求時出現(xiàn)的所有本地服務(wù)調(diào)用,服務(wù)請求都被委托給相同的 Java 接口。
          • Session——對于相同“會話”中的所有請求,服務(wù)請求都被委托給相同的 Java 實例。
          • module——對于相同“模塊”中的所有請求,服務(wù)請求都被委托給相同的 Java 實例。

            除了模塊范圍內(nèi)的實現(xiàn)外,對于其他三個,SCA 運行時都將防止對該實現(xiàn)的實例并發(fā)執(zhí)行方法。

            以下代碼片段顯示了會話范圍內(nèi)的服務(wù)的接口。

            清單 8. 會話范圍服務(wù)的接口

          package services.profile;
          import org.osoa.sca.annotations.Scope;
          @Scope("session")
          public interface ProfileService{
          public String getFirstName();
          public void setFirstName(String pName);
          public String getLastName();
          public void setLastName(String pName);
          public boolean isLoggedIn();
          public void setLoggedIn(boolean pStatus);
          public String getId();
          public void setId(String pId);
          }

            范圍服務(wù)可以使用 @Init Annotation 和 @Destroy Annotation 在其 Java 實現(xiàn)上實現(xiàn)生命周期方法。@Init——方法僅在其范圍開始處且已注入了其屬性和引用后調(diào)用一次。@Destroy——方法在其范圍結(jié)束時調(diào)用。

            清單 9 顯示了具有生命周期方法的 Java 實現(xiàn)類。

            清單 9. 具有生命周期方法的 Java 實現(xiàn)類

          package services.profile;
          import org.osoa.sca.annotations.*;
          @Service(ProfileService.class)
          public class ProfileServiceImpl implements ProfileService {
          public String getFirstName( ) { ....}
          @Init
          public void start() { . . .  }
          @Destroy
          public void stop() { . . . }

          }

            實現(xiàn)配置屬性

            Java 類中字段或方法上的 @Property Annotation 用于定義 Java 組件實現(xiàn)的配置屬性。以下是 @Property Annotation 的特性:

          • name——屬性的名稱,缺省值為 Java 類的字段的名稱。
          • require——指定是否需要注入,缺省值為 false。

            清單 10 顯示了使用 @Property Annotation 的配置屬性的定義。

            清單 10. 使用 @Property Annotation 的配置屬性的定義

          package services.payroll;
          import org.osoa.sca.annotations.Property;
          import org.osoa.sca.annotations.Reference;
          import services.payrolldata.PayrollDataService;
          public class PayrollServiceImpl implements PayrollService {
          @Property
          private String currency = "INR";
          @Reference
          private PayrollDataService payrollDataService;
          public PayrollStatement getPayrollStatement (String employeeID) { . . . . }
          }

          基本客戶機(jī)模型

            客戶機(jī)可以從 SCA 組件和非 SCA 組件獲得對服務(wù)的訪問。

            從 SCA 組件實現(xiàn)訪問服務(wù)

            獲得對服務(wù)的訪問的不同方法如下:

            使用引用注入 通過定義服務(wù)的類型接口的 Java 類數(shù)據(jù)成員指定和通過 @Reference Annotation 加標(biāo)注,可使用引用注入獲得對服務(wù)的訪問。@Reference Annotation 的特性有:

          • name——引用的名稱。
          • required——是否需要服務(wù)的注入。

            清單 11 顯示了使用 @Reference Annotation 的 Java 實現(xiàn)。

            清單 11. 使用 @Reference Annotation 的 Java 實現(xiàn)

          package services.profile;
          import org.osoa.sca.annotations.Service;
          import org.osoa.sca.annotations.Reference;
          @Service(LoginService.class)
          public class LoginServiceImpl implements LoginService{
          @Reference(name="profileService", required=true)
          private ProfileService profileService;
          public int login(String employeeID, String password) { .... }
          }

            以下是上述組件實現(xiàn)對應(yīng)的組件類型。

            清單 12. 組件類型

          <?xml version="1.0" encoding="ASCII"?>
          <componentType xmlns="http://www.osoa.org/xmlns/sca/0.9">
          <service name="ProfileService ">
          <interface.java interface="services.profile.LoginService"/>
          </service>
          <reference name="profileService">
          <interface.java interface="services.profile.ProfileService"/>
          </reference>
          </componentType>

            使用模塊上下文

            使用模塊上下文訪問服務(wù)的必要事項有:

          • 字段必須定義為能接受注入的模塊上下文。
          • 必須對注入的模塊上下文調(diào)用方法。

            通過將字段定義為 ModuleContext 類型,或使用 @Context Annotation,可指定使用模塊上下文進(jìn)行服務(wù)訪問。清單 13 顯示了 ModuleContext 接口及其 locateService() 方法。

            清單 13. ModuleContext 接口

          package org.osoa.sca;
          public interface ModuleContext {
          ...
          Object locateService(String serviceName);
          }

            清單 14 顯示了使用 @Context Annotation 的模塊上下文定義示例:

            清單 14. 使用 @Context Annotation 的模塊上下文定義

          package innovasolutions.web.ui;
          import java.io.IOException;
          import javax.servlet.ServletConfig;
          import javax.servlet.ServletContext;
          import javax.servlet.ServletException;
          import javax.servlet.http.HttpServlet;
          import javax.servlet.http.HttpServletRequest;
          import javax.servlet.http.HttpServletResponse;
          import org.osoa.sca.CurrentModuleContext;
          import org.osoa.sca.ModuleContext;
          import services.profile.LoginService;
          public class LoginServlet extends HttpServlet{
          private ServletContext mContext;
          public void init(ServletConfig pCfg) throws ServletException{
          mContext = pCfg.getServletContext();
          }
          public void doPost(HttpServletRequest pReq,
            HttpServletResponse pResp) throws ServletException{
          LoginService loginMgr = (LoginService)CurrentModuleContext.getContext().
          locateService("LoginServiceComponent");
          if (loginMgr == null){
          throw new ServletException("LoginManager not found");
          }
          . . . .
          }

          從非 SCA 組件實現(xiàn)訪問服務(wù)

            屬于 SCA 模塊一部分的非 SCA 組件使用模塊上下文獲取對服務(wù)的訪問。它們在其實現(xiàn)中使用 ModuleContext 查找服務(wù)。它們通過 CurrentModuleContext 類獲取對 current ModuleContext 的訪問,如清單 15 中所示。

            清單 15. CurrentModuleContext 類

          package org.osoa.sca;
          public final class CurrentModuleContext {
          public static ModuleContext getContext() {... }
          }

            非 SCA 組件實現(xiàn)將包括與以下所示類似的代碼行,以獲取對模塊上下文的訪問:ModuleContext moduleContext = CurrentModuleContext.getContext();

            錯誤處理

            調(diào)用服務(wù)方法客戶機(jī)時可能會遇到以下異常:

          • 業(yè)務(wù)異常——由被調(diào)用的服務(wù)方法的實現(xiàn)引發(fā)。
          • SCA 運行時異常——由 SCA 運行時引發(fā),指示組件的異常管理及與遠(yuǎn)程服務(wù)的交互中存在的問題。當(dāng)前受支持的 SCA 運行時異常有服務(wù)運行時異常和服務(wù)不可用異常。

            異步編程

            在服務(wù)的異步編程中,客戶機(jī)調(diào)用服務(wù),并在不等待服務(wù)執(zhí)行的情況下繼續(xù)進(jìn)行自身的執(zhí)行。

            SCA 異步編程模型支持三種類型的異步調(diào)用。即:

          • 非阻塞方法調(diào)用
          • 對話服務(wù)
          • 回調(diào)
          • 非阻塞調(diào)用

            通過使用非阻塞調(diào)用,客戶機(jī)可調(diào)用服務(wù)并立即繼續(xù)進(jìn)行后續(xù)處理,而不必等待服務(wù)執(zhí)行。非阻塞方法使用 @Oneway Annotation 進(jìn)行調(diào)用。當(dāng)前 SCA 支持對返回“void”且沒有已聲明異常的方法進(jìn)行非阻塞調(diào)用。

            對話服務(wù)

            服務(wù)的客戶機(jī)和服務(wù)提供者之間的對話經(jīng)常在遠(yuǎn)程服務(wù)執(zhí)行期間發(fā)生。傳統(tǒng)編程模型要求編寫大量的代碼來支持此模式。SCA 簡化了對話服務(wù)的設(shè)計,而將 ID 生成、狀態(tài)管理和路由的細(xì)節(jié)留給 SCA 容器處理。

            在 SCA 中,使用會話來維護(hù)有關(guān)客戶機(jī)和遠(yuǎn)程服務(wù)間的單個對話的信息。SCA 使用 @Scope、@Session 和 @SessionID Annotation 來實現(xiàn)對話服務(wù)。

            回調(diào)

            回調(diào)服務(wù)提供從服務(wù)提供者回到其客戶機(jī)的異步通信。雙向服務(wù)使用的回調(diào)是具有兩個接口的服務(wù),一個供服務(wù)提供者使用,另一個供客戶機(jī)使用。

            SCA 通過在遠(yuǎn)程服務(wù)接口上使用 @Callback Annotation 來提供回調(diào)服務(wù)(接受接口的 Java Class 對象作為參數(shù))。

            清單 16 顯示了 @Callback Annotation 的使用。

            清單 16. @Callback Annotation

          package somepackage;
          import org.osoa.sca.annotations.Callback;
          import org.osoa.sca.annotations.Remotable;
          @Remotable
          @Callback(MyServiceCallback.class)
          public interface MyService {
          public void someMethod(String arg);
          }
          @Remotable
          public interface MyServiceCallback {
          public void receiveResult(String result);
          }

            開放源代碼運行時和工具

            有一個開放源代碼項目提供服務(wù)組件體系結(jié)構(gòu)的運行時實現(xiàn),可用于運行 SCA 應(yīng)用程序。此項目稱為 Tuscany,目前在 Apache 處于孵化期。此項目的主要參與者有 IBM、BEA、Oracle、Sybase、SAP、IONA 和 Siebel。

            結(jié)束語

            本文分別通過 Java 接口和 Java 類組件實現(xiàn)描述了服務(wù)的表示形式和實現(xiàn)。文中說明了使用 Java Annotation 的服務(wù)實現(xiàn)的配置屬性。您了解了從 SCA 和非 SCA 組件訪問服務(wù)的各種方式,還了解了各種錯誤處理機(jī)制、異步編程模型和各種異步調(diào)用。

          posted on 2008-03-11 14:03 gembin 閱讀(444) 評論(0)  編輯  收藏 所屬分類: SCASOA

          導(dǎo)航

          統(tǒng)計

          常用鏈接

          留言簿(6)

          隨筆分類(440)

          隨筆檔案(378)

          文章檔案(6)

          新聞檔案(1)

          相冊

          收藏夾(9)

          Adobe

          Android

          AS3

          Blog-Links

          Build

          Design Pattern

          Eclipse

          Favorite Links

          Flickr

          Game Dev

          HBase

          Identity Management

          IT resources

          JEE

          Language

          OpenID

          OSGi

          SOA

          Version Control

          最新隨筆

          搜索

          積分與排名

          最新評論

          閱讀排行榜

          評論排行榜

          free counters
          主站蜘蛛池模板: 丽江市| 青浦区| 乌拉特中旗| 沐川县| 哈尔滨市| 定州市| 曲松县| 阿坝县| 林甸县| 邵东县| 玛曲县| 菏泽市| 德阳市| 双桥区| 波密县| 布尔津县| 济源市| 清水县| 大化| 南开区| 南宫市| 台中县| 沛县| 铜山县| 称多县| 博乐市| 板桥市| 增城市| 二连浩特市| 安仁县| 高密市| 靖宇县| 奇台县| 平阳县| 印江| 铁岭县| 平昌县| 武山县| 四平市| 胶南市| 开封市|