国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
從Spring實例入手談SCA Component的創(chuàng)建和調(diào)用

級別: 中級

李 嘉濤 (lijiatao@cn.ibm.com), IBM 中國軟件開發(fā)實驗室 高級軟件工程師
趙 雄偉 (zhaoxiongwei@126.com), 北京交通大學(xué)計算機軟件與理論碩士研究生
王 強 (wangq@cn.ibm.com), IBM 中國軟件開發(fā)實驗室 軟件工程師

2006 年 9 月 06 日

面向服務(wù)組件的架構(gòu)(Service Component Architecture,SCA),是目前業(yè)界最前沿的技術(shù)概念之一。但是對于很多開發(fā)人員來說,如何在SCA的架構(gòu)上進行設(shè)計和開發(fā)還是顯得相對抽象的。WID(WebSphere Integration Developer)和WPS(WebSphere Process Server)的推出,使得客戶能夠更加簡單地向面向組件編程模型轉(zhuǎn)變。本文將介紹在SCA編程模型中創(chuàng)建和調(diào)用SCA Component的基本概念和方法,并以一系列簡單的實例來說明在不同場景中如何使用WID進行Component的創(chuàng)建和調(diào)用。SCA支持運用多種技術(shù)實現(xiàn)組件,Spring framework憑借依賴注入思想,成為這些技術(shù)中的天然一員。文中的實例實現(xiàn)了基于Spring framework的SCA組件,期待能夠拋磚引玉,并為讀者以后深入了解SCA打下基礎(chǔ)。讀者定位為具有WID開發(fā)經(jīng)驗的開發(fā)人員,對SOA和SCA,Spring有所了解。

引言

面向服務(wù)組件的架構(gòu)(Service Component Architecture,SCA),是目前業(yè)界最前沿的技術(shù)概念之一。但是對于很多開發(fā)人員來說,如何在SCA的架構(gòu)上進行設(shè)計和開發(fā)還是顯得相對抽象的。WID(WebSphere Integration Developer)&WPS(WebSphere Process Server)的推出,使得客戶能夠更加簡單地向面向組件編程模型轉(zhuǎn)變。本文將介紹在SCA編程模型中創(chuàng)建和調(diào)用SCA Component的基本概念和方法,并以一系列簡單的實例來說明在不同場景中如何使用WID進行Component的創(chuàng)建和調(diào)用。SCA支持運用多種技術(shù)實現(xiàn)組件,Spring framework憑借依賴注入思想成為這些技術(shù)中的天然一員,文中的實例實現(xiàn)了基于Spring framework的SCA組件,期待能夠拋磚引玉,并為讀者以后深入了解SCA打下基礎(chǔ)。

讀者定位為具有WID開發(fā)經(jīng)驗的開發(fā)人員,對SOA和SCA,Spring有所了解。





1.SCA簡介

SCA是為了構(gòu)建SOA系統(tǒng)而設(shè)計的一種規(guī)范,目前的版本是0.9。SCA的核心概念是服務(wù)及其相關(guān)實現(xiàn)。服務(wù)由接口定義,而接口包含一組操作。服務(wù)實現(xiàn)可以引用其他服務(wù),稱為引用。服務(wù)可以有一個或多個屬性,這些屬性是可以在外部配置的數(shù)據(jù)值。SCA使開發(fā)者把更多的精力集中在業(yè)務(wù)邏輯上。組件(component)的提出,在底層應(yīng)用實現(xiàn)和service之間增加了一層,圖1SOA架構(gòu)圖可以直觀的找到組件的位置。這樣不必把每個單獨的功能都定義為service,更加優(yōu)化了服務(wù)的顆粒度。


圖1 SOA架構(gòu)圖





2.實例介紹

實例主要實現(xiàn)查詢賬戶余額信息的業(yè)務(wù)功能,主要體現(xiàn)在多種不同場景中如何構(gòu)建基于SCA的應(yīng)用。實例從構(gòu)建一個基于Sprig framework的組件開始,層層深入,逐步展現(xiàn)對組件、組件之間、模塊之間的方法的調(diào)用。圖2展示了實例最終整體框架圖,通過此圖可以對這個實例有一個整體的認識。您也可以下載實例代碼,對照代碼看下面的介紹更加直觀。


圖2 實例整體框架





3.創(chuàng)建一個基于Spring實現(xiàn)的component

Web service并不是實現(xiàn)SOA的唯一技術(shù),SCA支持多種技術(shù)實現(xiàn)。目前服務(wù)接口支持WSDL和Java兩種,以后將會擴展到其他接口語言。構(gòu)建SCA的服務(wù)組件可以采用EJB,Spring bean和CORBA 等多種技術(shù),可以應(yīng)用Java、PHP、C++等多種語言。

Spring作為一種非侵略性的,輕量級的framework能很好地與SCA相融合,下面這段文字出自SCA白皮書的原文。

SCA views Spring as a natural partner which can be used as a component implementation technology. The Spring framework can be used to create components and wire them within a module using its dependency injection capabilities. SCA may be used to extend the capabilities of Spring components by publishing Spring beans as entry points to be accessed as services by other modules as well as by providing Spring beans with service references wired to services of other modules.

以此可以看出,SCA和Spring有著密切的關(guān)系,可以相互補充。相信未來SCA和Spring會有更緊密的融合,以更大更好地發(fā)揮各自的優(yōu)點。

3.1 SCA和Spring的共同思想:依賴注入

從GoF設(shè)計模式中,我們已經(jīng)習(xí)慣一種思維編程方式:Interface Driven Design 接口驅(qū)動,接口驅(qū)動有很多好處,可以提供不同的靈活的子類實現(xiàn),增加代碼穩(wěn)定和健壯性等等。依賴注入(Dependency Injection)又稱為控制反轉(zhuǎn)(Inversion of Control)是解決調(diào)用者和被調(diào)用者之間關(guān)系的一種模式,它基于接口編程,在調(diào)用時進行對象的實例化,降低了耦合度,提高了重用性。在表1中給出了依賴注入的三種模式。

表1依賴注入有三種模式

類型方式應(yīng)用框架
第一種類型從JNDI或ServiceManager等獲得被調(diào)用者,這里類似ServiceLocator模式。1.SCA
2. EJB/J2EE
第二種類型使用JavaBeans的setter方法1. Spring Framework
2. WebWork/XWork
第三種類型在構(gòu)造方法中實現(xiàn)依賴1. PicoContainer

SCA組件主要通過接口進行交互。組件提供的服務(wù)是一個由接口定義的操作的集合,組件引用其他組件提供的服務(wù)也是通過該服務(wù)定義的接口來進行。SCA主要是應(yīng)用表1中第一種依賴注入類型。

Spring Framework是構(gòu)建Java應(yīng)用的一個流行平臺,您可以通過developerWorks的文章"Spring 系列: Spring 框架簡介"來了解Spring框架。Spring提供了IoC容器,一般采用表1中第二種通過JavaBeans的setter方式實現(xiàn)依賴注入。通過在Spring配置文件ApplicationContext.xml中描述bean的信息,Spring IoC將根據(jù)這個文件在容器中實例化bean,再通過BeanFactory(在org.springframework.beans.facotry包中)找到實例化的bean。

因此在本質(zhì)上SCA和Spring實例化對象的思想是一致的,都在不同程度上應(yīng)用了依賴注入模式,和基于接口的實現(xiàn)。SCA將Spring視為實現(xiàn)component眾多技術(shù)中的天然一員,能夠通過Spring framework創(chuàng)建component,也可以在同一Module中連接這些component。下面將介紹如何基于Spring來創(chuàng)建SCA component。

3.2如何基于Spring來創(chuàng)建SCA component

現(xiàn)在我們開始創(chuàng)建實例,在這一步中將應(yīng)用Spring框架構(gòu)建一個component,這個component的功能是根據(jù)輸入的customerID,返回該customerID的余額balance和幣種currency。

首先創(chuàng)建名為SimpleBankModule的Module,如下圖所示。然后創(chuàng)建基于Spring framework的實現(xiàn),在這點無需考慮SCA,只是創(chuàng)建Spring應(yīng)用實現(xiàn)。



在實際應(yīng)用中,一般都是從數(shù)據(jù)庫獲取customer的賬戶信息,Spring framework提供了強大的數(shù)據(jù)庫操作的支持,Spring DAO封裝了數(shù)據(jù)庫操作,操作更簡單。實例將從數(shù)據(jù)庫中取得賬戶信息,但為了讓讀者更快的將實例運行起來也提供了dummy數(shù)據(jù)。您只需進行描述配置就可以選擇不同的數(shù)據(jù)來源,這也體現(xiàn)了Spring framework的靈活性。如清單1所示Spring Bean的描述文件ApplicationContext.xml


清單1. ApplicationContext.xml.
<?xml version="1.0" encoding="UTF-8"?>                        <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"                        "http://www.springframework.org/dtd/spring-beans.dtd">                        <beans>                        |(1) <bean id="JDBCConn"                        class="org.springframework.jdbc.datasource.DriverManagerDataSource">                        <property name="driverClassName">                        <value>COM.ibm.db2.jdbc.app.DB2Driver</value>                        </property>                        <property name="url">                        <value>jdbc:db2:sample</value>                        </property>                        <property name="username">                        <value>username</value>                        </property>                        <property name="password">                        <value>password</value>                        </property>                        </bean>                        |(2) <bean id="DBAccountInfo"                        class="com.ibm.simplebank.impl.QueryBalanceDBImpl">                        <property name="dataSource">                        <ref local="JDBCConn" />                        </property>                        </bean>                        |(3) <bean id="DummyAccountInfo"                        class="com.ibm.simplebank.impl.QueryBalanceDummyImpl">                        <property name="balance">                        <value>100.00</value>                        </property>                        <property name="currency">                        <value>USD</value>                        </property>                        </bean>                        |(4) <bean id="QueryBalance"                        class="com.ibm.simplebank.impl.QueryBalanceImpl">                        <property name="accountInfo">                        <!-- 從數(shù)據(jù)庫中取得數(shù)據(jù)ref到"DBAccountInfo",使用dummy數(shù)據(jù)ref到"DummyAccountInfo" -->|-------10--------20--------30--------40--------50--------60--------70--------80--------9||-------- XML error:  The previous line is longer than the max of 90 characters ---------|<ref local="DummyAccountInfo" />                        </property>                        </bean>                        </beans>

其中(1)這個bean用來建立數(shù)據(jù)庫連接,可以選擇不同的數(shù)據(jù)庫及數(shù)據(jù)庫連接方式;(2)和(3)的實現(xiàn)類都實現(xiàn)了同一個接口SimpleBankDAO,這個接口的方法就是getAccountInfo(String customerID),(2)的實現(xiàn)類QueryBalanceDBImpl是查詢數(shù)據(jù)庫取得數(shù)據(jù)的實現(xiàn),(3)的實現(xiàn)類QueryBalanceDummyImpl只是將其屬性實例化。(4)才是真正對外的實現(xiàn)類,更改它的引用實現(xiàn)從數(shù)據(jù)庫取得數(shù)據(jù)還是用dummy數(shù)據(jù)。

現(xiàn)在我們創(chuàng)建這個component對外的接口,為了與Spring相結(jié)合,所以在定義接口時要定義Java接口,在其中聲明要提供的業(yè)務(wù)方法。在Business Integration視圖中新建Interface默認的是WSDL 接口,所以要在新建向?qū)е行陆↗ava接口,如下圖所示:



清單2是QueryBalance接口,通過這個接口實現(xiàn)這個component與外交互。


清單2. QueryBalance.java.
public interface QueryBalance {                        public AccountInfo getBalance(String customerID);                        }

然后在Business Integration視圖中,點開SimpleBankModule的Assembly Diagram,添加component,并命名為QueryBalanceComponent,然后為這個component添加剛才創(chuàng)建的Java接口QueryBalance,如下圖所示:





生成QueryBalanceComponent的Java實現(xiàn),雙擊QueryBalanceComponent并選擇Java實現(xiàn),進入實現(xiàn)類。在實現(xiàn)類中加載Spring的ApplicationContext.xml,并實現(xiàn)getBalance方法。如清單3所示。


清單3 QueryBalance.java.
private ClassPathXmlApplicationContext appContext = new ClassPathXmlApplicationContext(                        "ApplicationContext.xml");                        private BeanFactory factory = (BeanFactory) appContext;                        public AccountInfo getBalance(String customerID) {                        QueryBalanceImpl queryBalance = (QueryBalanceImpl) factory.getBean("QueryBalance");|-------10--------20--------30--------40--------50--------60--------70--------80--------9||-------- XML error:  The previous line is longer than the max of 90 characters ---------|SimpleBankDAO dao = queryBalance.getAccountInfo();                        AccountInfo  accountInfo = dao.getAccountInfo(customerID);                        return accountInfo;                        }

QueryBalanceComponent這個組件就創(chuàng)建完了,單元測試其是否工作正常。





回頁首


4.在SCA Module內(nèi)部調(diào)用component

上面創(chuàng)建的QueryBalanceComponent實現(xiàn)了通過customerID查詢賬戶信息的功能,但在真實應(yīng)用中在查詢賬戶信息前需要得到授權(quán),因此要加上權(quán)限認證??紤]到權(quán)限認證是一個相對獨立的功能模塊,并且在整個系統(tǒng)中都需要使用,所以考慮在一個單獨的Module中實現(xiàn)權(quán)限認證。為了保證應(yīng)用的可擴展性,在SimpleBankModule中增加SimpleBankFacade組件,來調(diào)度對整個Module的請求。

在同一SCA Module內(nèi)部,component之間通過reference進行交互。通過接口實現(xiàn)跨組件的操作。

下面將實現(xiàn)SimpleBankFacade組件,如圖3所示,這個component封裝了對QueryBalanceComponent的引用,負責(zé)調(diào)度組件的請求,方便以后系統(tǒng)的擴展。



1) 創(chuàng)建數(shù)據(jù)類型FacadeOutput



2) 創(chuàng)建WSDL類型接口SimpleBankFacade



3) 創(chuàng)建組件SimpleBankFacade

創(chuàng)建一個組件并命名為SimpleBankFacade,然后為這個component添加剛才創(chuàng)建的WSDL接口SimpleBankFacade

4) 添加SimpleBankFacade對QueryBalanceComponent的引用

在兩個組件間Add wire,添加引用。



5) 實現(xiàn)組件SimpleBankFacade

雙擊SimpleBankFacade并選擇Java實現(xiàn),WID會自動生成一些實現(xiàn)代碼,其中已經(jīng)實現(xiàn)了對QueryBalanceComponent的引用。如清單4中(1)就是引用的實現(xiàn),通過調(diào)用這個方法就能得到QueryBalanceComponent的引用。我們做的就是在(2)下面加入業(yè)務(wù)實現(xiàn)。(3)創(chuàng)建輸出對象,其中http://SimpleBankModule為數(shù)據(jù)對象FacadeOutput的Namespace。(4)通過(1)取得QueryBalanceComponent的引用。(5)調(diào)用QueryBalanceComponent的接口聲明的方法。


清單4 SimpleBankFacadeImpl.java.
public QueryBalance locateService_QueryBalancePartner() {                        return (QueryBalance) ServiceManager.INSTANCE                        .locateService("QueryBalancePartner");    |(1)                        }                        public DataObject QueryBalance(String customerID, String password) {                        //TODO Needs to be implemented.                                   |(2)                        ServiceManager serviceManager = new ServiceManager();                        BOFactory bof = (BOFactory) serviceManager                        .locateService("com/ibm/websphere/bo/BOFactory");                        DataObject facadeOutput = bof.create("http://SimpleBankModule",                        "FacadeOutput");                              |(3)                        QueryBalance queryBalance = locateService_QueryBalancePartner(); |(4)                        AccountInfo accountInfo = (AccountInfoImpl) queryBalance                        .getBalance(customerID);                     |(5)                        facadeOutput.setBoolean("isAuthed", true);                        facadeOutput.setString("currency", accountInfo.getCurrency());                        facadeOutput.setFloat("balance", accountInfo.getBalance());                        return facadeOutput;                        }

6) 單元測試組件SimpleBankFacade,看這個兩個組件是否工作正常。





回頁首


5.在SCA Module之間調(diào)用component

按照上一步的分析,需要單獨創(chuàng)建一個Module來實現(xiàn)權(quán)限認證,在這部分將實現(xiàn)這個組件并將在SimpleBankModule中調(diào)用。這一步完成后實例的結(jié)構(gòu)如下圖所示。



在兩個Module中的Component進行通信時需要將一個component導(dǎo)出,然后另一個component再導(dǎo)入。在導(dǎo)出導(dǎo)入時可以選擇SCA binding也可以選擇Web service binding,具體選擇哪種方式要根據(jù)具體環(huán)境而定。如果兩個模塊在一個subsystem中(或者說在同一個應(yīng)用服務(wù)器上)可以直接選擇SCA binding;相反則要選擇web service binding,通過WSDL進行調(diào)用交互。通過WSDL調(diào)用的方式與引用外部service一樣,不再詳細介紹,下面主要介紹如何通過SCA binding的方式進行跨module的component之間的調(diào)用。

1) 創(chuàng)建SimpleBankModule,在其中創(chuàng)建并實現(xiàn)AuthenticationComponent AuthenticationComponent的接口為Authentication,如下圖所示,其實現(xiàn)只判斷customerID是否為空,如果不為空則認證成功,否則失敗。



2)



3) 將接口Authentication復(fù)制到SimpleBankModule中為了在SimpleBankModule中引用AuthenticationComponent,要將接口Authentication復(fù)制到SimpleBankModule中。也可以創(chuàng)建一個library然后將接口Authentication定義在這個library里面,其它module添加對這個library的依賴從而共同使用這個接口。

4) 在SimpleBankModule中添加對AuthenticationComponent的引用首先添加import,并將其改名為ImportAuthentication。然后為ImportAuthentication添加接口Authentication 再為ImportAuthentication生成SCA binding



為ImportAuthentication選擇要import的服務(wù)AuthenticationComponentExport



5) 添加SimpleBankFacade對ImportAuthentication的引用

6) 重新生成SimpleBankFacade的實現(xiàn)

重新生成后WID自動實現(xiàn)了對AuthenticationComponent的引用,如清單5中的(1),這樣在調(diào)用時與Module內(nèi)部component之間的調(diào)用一樣。(2)通過(1)取得對AuthenticationComponent的引用,(3)調(diào)用方法取得驗證結(jié)果。


清單5 SimpleBankFacadeImpl.java.
public Authentication locateService_AuthenticationPartner() {                        return (Authentication) ServiceManager.INSTANCE                        .locateService("AuthenticationPartner");              |(1)                        }                        public DataObject QueryBalance(String customerID, String password) {                        ... ...                        Authentication authentication = locateService_AuthenticationPartner();                        |(2)                        boolean isAuthed = authentication.GetAuth(customerID, password)                        .booleanValue();                                          |(3)                        facadeOutput.setBoolean("isAuthed", isAuthed);                        if (isAuthed) {                        QueryBalance queryBalance = locateService_QueryBalancePartner();                        AccountInfo accountInfo = (AccountInfoImpl) queryBalance                        .getBalance(customerID);                        facadeOutput.setBoolean("isAuthed", true);                        facadeOutput.setString("currency", accountInfo.getCurrency());                        facadeOutput.setFloat("balance", accountInfo.getBalance());                        }                        return facadeOutput;                        }

7) 單元測試

要啟動WPS,然后將這兩個Module添加到server上,然后在測試時選擇在WPS上測試。

這樣將process的流程寫在了SimpleBankFacade這個component的實現(xiàn)中,這個component也可以用process component代替,這樣就可以通過Java或者BPEL語言來修改整個應(yīng)用的process。





6.客戶端與SCA Module交互的方式

通過上面的步驟已經(jīng)實現(xiàn)了查詢賬戶信息的業(yè)務(wù)功能,但是一直都是在Test component模式下調(diào)用組件。在這一步將創(chuàng)建客戶端,從客戶端調(diào)用剛才創(chuàng)建的服務(wù)。這一步完成后實例的結(jié)構(gòu)如下圖所示。



客戶端調(diào)用component服務(wù)有兩種實現(xiàn)方式,一種是在Module內(nèi)部用Standalone的方式,一種是將component服務(wù)發(fā)布為web service然后通過WSDL進行調(diào)用。第一種方式的使用范圍比較有限,只限于在Module內(nèi)部,但是在安全、性能等方面要比通過web service的方式好。

6.1 SCA module內(nèi)部直接引用 (Stand alone)

當(dāng)客戶端只是在Module內(nèi)部時,無需將服務(wù)發(fā)布為web service,即可直接通過standalone的方式調(diào)用。通過standalone的方式調(diào)用component與component之間調(diào)用的方法類似。

首先在SimpleBankModule內(nèi)添加standalone引用,如下圖所示。



然后將其引用到SimpleBankFacade,引用的默認名字為SimpleBankFacadePartner。最后實現(xiàn)服務(wù)的調(diào)用,下面是調(diào)用SimpleBankFacade的核心代碼。如清單6所示,(1)通過standalone引用的名字引用SimpleBankFacade的服務(wù)。


清單6 SimpleBankFacadeImpl.java.
String customerID = request.getParameter("customerID");                        String password = request.getParameter("password");                        ServiceManager serviceManager = new ServiceManager();                        SimpleBankFacade service = (SimpleBankFacade) serviceManager                        .locateService("SimpleBankFacadePartner");                 |(1)                        DataObject facadeOutput = service.QueryBalance(customerID, password);                        boolean isAuthed = facadeOutput.getBoolean("isAuthed");                        float balance = facadeOutput.getFloat("balance");                        String currency = facadeOutput.getString("currency");

6.2調(diào)用SCA Module發(fā)布出來的web service

但是很多時候客戶端并不在Module內(nèi)部,有時甚至不在一個Application server上,這時就需要將服務(wù)發(fā)布為web service。

當(dāng)SCA Module發(fā)布出來web service以后,對于客戶端來說web service的實現(xiàn)框架、實現(xiàn)技術(shù)、數(shù)據(jù)來源等都是透明的??蛻舳酥魂P(guān)心web service的WSDL。因此這一部分與SCA無關(guān),但作為整個實例的一部分,將結(jié)合實際開發(fā)經(jīng)驗談?wù)効蛻舳苏{(diào)用web service。

首先要將組件SimpleBankFacade Export為web service binding,然后在WPS的administrative console,找到應(yīng)用SimpleBankModuleApp,點擊"Publish WSDL files",如下圖所示,下載WSDL的zip文件。



然后將這個zip文件import 到工作區(qū)的一個臨時項目中,在wsdl文件上點擊右鍵,選擇Web Services'Test with Web Services Explorer來測試服務(wù)是否工作正常。



測試成功后選擇Web Services'Generate Client生成客戶端。在生成客戶端時可以選擇客戶端類型,如下圖所示。



6.2.1 用Java client模式調(diào)用

選擇Java類型客戶端,WID會自動生成的一些Java文件來調(diào)用Web service。其中在SimpleBankFacadeExport_SimpleBankFacadeHttpServiceLocator.java中已經(jīng)將web service的信息寫死了,在Java application中通它來調(diào)用web service。清單7是通過自動生成的代理類調(diào)用web service的核心代碼。


清單7 QueryBalanceJavaApplication.java in SimpleBankJavaClient project.
SimpleBankFacadeExport_SimpleBankFacadeHttpServiceLocator serviceLocator =                        new SimpleBankFacadeExport_SimpleBankFacadeHttpServiceLocator();                        SimpleBankFacade simpleBankFacade = serviceLocator                        .getSimpleBankFacadeExport_SimpleBankFacadeHttpPort();|-------10--------20--------30--------40--------50--------60--------70--------80--------9||-------- XML error:  The previous line is longer than the max of 90 characters ---------|FacadeOutput output = simpleBankFacade.queryBalance(customerID,                        password);

6.2.2 用web client模式調(diào)用

選擇Web類型客戶端,在WID自動生成的文件中除了有上面選擇Java類型客戶端生成的Java文件外,還添加和修改一些Web應(yīng)用的配置文件。如在web.xml文件中加入了引用web service的JNDI描述,這樣在web客戶端就可以通過JNDI名字調(diào)用web service,清單8是通過JNDI名字調(diào)用web service的核心代碼。


清單8 QueryBalance.java in SimpleBankWebClient project.
InitialContext ic = new InitialContext();                        Service service = (Service) ic.lookup("java:comp/env/service/SimpleBankFacadeExport_|-------10--------20--------30--------40--------50--------60--------70--------80--------9||-------- XML error:  The previous line is longer than the max of 90 characters ---------|SimpleBankFacadeHttpService");                        SimpleBankFacade simpleBankFacade =                        (SimpleBankFacade)service.getPort(SimpleBankFacade.class);                        FacadeOutput output = simpleBankFacade.queryBalance(customerID,                        password);





7.通過ESB調(diào)用SCA Module

通過上面這些步驟實例已經(jīng)完成了,但是再從整個實例架構(gòu)的角度考慮,會發(fā)現(xiàn)web service的調(diào)用者和提供者仍是緊耦合的,調(diào)用者依賴于提供者發(fā)布的WSDL文件。服務(wù)提供者對服務(wù)接口的改變會使調(diào)用者無法正常使用。通過使用ESB降低服務(wù)的調(diào)用者和提供者的耦合度,可以很好的解決這個問題。

ESB是調(diào)用服務(wù)的客戶機和這些服務(wù)的提供者之間的中間件,負責(zé)處理它們之間的連接任務(wù),從而簡化了客戶機和提供者,整個調(diào)用過程對服務(wù)兩端是透明的,如下圖所示。



Service Integration Bus在WebSphere Application Server中,是早期IBM實現(xiàn)ESB產(chǎn)品,現(xiàn)在雖然可以作為一種開發(fā)策略,但已不推薦使用,推薦使用WESB提供的ESB服務(wù)??蓞⒄誌BM WebSphere 開發(fā)者技術(shù)期刊: 使用 WebSphere Application Server V6 構(gòu)建企業(yè)服務(wù)總線 -- 第二部分來了解Sibus。

WESB(WebSphere Enterprise Service Bus)為構(gòu)建在開放標(biāo)準和SOA的IT環(huán)境提供了一個ESB,相對Sibus來說它使構(gòu)建中間層更簡單,更容易管理,可以在前期開發(fā)中介功能,提供更廣泛的連接。WID為WESB提供了一個很好的開發(fā)工具,通過構(gòu)建Mediation module來提供ESB服務(wù),如下圖WESB的中介模型圖。



Mediation module是一個特殊的SCA module,該模塊在SCA的模塊之間,以及SCA和非SCA之間建立了交流的橋梁。通過Mediation module可以截取、修改服務(wù)請求者(SCA Export)和服務(wù)提供者(SCA Import)之間傳遞的消息,從而減少依賴、降低耦合度。您可參照developerWorks的文章WebSphere Integration Developer中的中介模塊來更多了解Mediation module,進而構(gòu)建一個Mediation module來進一步完善實例。





8.結(jié)束語

本文從創(chuàng)建一個基于Spring framework的component開始,進而實現(xiàn)多個component的協(xié)同工作,再到Module之間component的交互,最后實現(xiàn)客戶端調(diào)用component的service的幾種方式方法,以一個開發(fā)者的角度介紹了SCA Component的創(chuàng)建和調(diào)用。對照圖2實例整體框架和圖1SOA結(jié)構(gòu)圖,實例在一定程度上基于SCA實現(xiàn)了SOA。

SCA支持多種技術(shù)和語言創(chuàng)建component,本文將Spring與SCA相融合旨在拋磚引玉,期待SCA與Spring等其他技術(shù)有更緊密的融合,以更加方便系統(tǒng)的遷移和整合,以及系統(tǒng)的維護和擴展。

同時也發(fā)現(xiàn),依賴注入模式也為開發(fā)者帶來了一些問題,比如實例化對象時更依賴于名字而不是創(chuàng)建類,這樣使一些潛在的錯誤在編譯時無法觸發(fā),只有在運行時才能捕獲。同樣的問題在類似Request.getAttrubute()的方法中以及引用JNDI名字時也會出現(xiàn)。



參考資料



作者簡介

李嘉濤 IBM 高級軟件工程師,工作在 IBM 中國軟件開發(fā)實驗室企業(yè)應(yīng)用開發(fā)部門,從1999年開始從事軟件方面的開發(fā)設(shè)計工作,在 Java 開發(fā)和 Web 開發(fā)方面有豐富的經(jīng)驗,現(xiàn)在正從事企業(yè)電子商務(wù)應(yīng)用的開發(fā)和支持工作,你可以通過lijiatao@cn.ibm.com與他聯(lián)系。


趙雄偉 北京交通大學(xué)計算機軟件與理論碩士研究生,目前在IBM CSDL 實習(xí),你可以通過zhaoxiongwei@126.com與他聯(lián)系。


王強 IBM 軟件工程師,工作在 IBM 中國軟件開發(fā)實驗室 - SOA Design Center,從事 Incubator 及 SOA、Grid 項目的工作,對 J2EE 架構(gòu)、 SOA 架構(gòu)、MDA/MDD 以及網(wǎng)格計算等技術(shù)有較深入的研究。聯(lián)系方式:wangq@cn.ibm.com。

本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
厲害了,Spring中bean的12種定義方法!
小白新手web開發(fā)簡單總結(jié)(六)-Spring的IoC容器
Spring常用注解
spring @component的作用
Spring AOP示例(注解方式)
MyEclipse 中開發(fā)SCA應(yīng)用入門 - 好高悟遠 - ItEye技術(shù)網(wǎng)站
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服