1.簡(jiǎn)介
Entry Point是SCA中模塊的“入口”。模塊可以通過(guò)Entry Point將自身定義好的組件(Component)發(fā)布成一個(gè)可供外部遠(yuǎn)程訪問的服務(wù),這所謂的“遠(yuǎn)程服務(wù)”都是通過(guò)一些標(biāo)準(zhǔn)的協(xié)議進(jìn)行訪問的,最常見的就是Web服務(wù),所以我們可以這樣去理解Entry Point:
Entry Point是將SCA組件發(fā)布成各種可供標(biāo)準(zhǔn)遠(yuǎn)程技術(shù)所訪問模型,這里的遠(yuǎn)程訪問技術(shù)可以是Web Service,JMS或者EJB等。
在這篇文章中,我將介紹如何使用Balto SCA容器,利用Entry Point來(lái)將已有的組件發(fā)布成一個(gè)可用Web服務(wù)。對(duì)SCA中組件的概念不明白的讀者可以先看看SCA程序設(shè)計(jì)系列的第一篇《本地服務(wù)》,或者可以看一下《淺談SCA》,都能幫助你理解一些SCA基本的概念。
2.如果定義Entry Point
Entry Point的定義是寫在sca.module文件中的,它的XML格式如下:
<
entryPoint?
name
="xs:NCName"
?multiplicity
="0..1?or?1..1?or?0..n?or?1..n"
?
>
*
???? <
interface
.interface-type
/>
??? ?<
binding
.binding-type?uri
="xs:anyURI"
/>
+
???? <
reference
>
wire-target-URI
</
reference
>
</
entryPoint
>
下面簡(jiǎn)單介紹一下Entry Point的XML文章中各個(gè)元素以及屬性的含義:
首先是entryPoint的屬性name,這個(gè)屬性是表示的是該Entry Point的名稱。
interface元素是指entryPoint對(duì)應(yīng)的接口。(讀者可以看一下《本地服務(wù)》,了解更多interface的信息)
binding元素表示entryPoint在發(fā)布該遠(yuǎn)程服務(wù),采用的什么樣的遠(yuǎn)程協(xié)議進(jìn)行綁定的。通常情況下都使用的是WebService Binding,除此之外,還有Ejb,JMS的Binding。
reference元素是指該Entry Point將哪個(gè)組件做為遠(yuǎn)程服務(wù)發(fā)布的實(shí)際調(diào)用對(duì)象。或者我們理解為:將哪個(gè)組件做為遠(yuǎn)程服務(wù)發(fā)布了出去。
在這一篇文章中我們只討論基于Web服務(wù)的綁定方式,所以整篇文章中所提到的Binding,都是WebService Binding。
組件通過(guò)Entry Point發(fā)布出去后,外部就可以通過(guò)Entry Point所設(shè)置的Binding的具體網(wǎng)絡(luò)協(xié)議對(duì)該組件進(jìn)行訪問。也就是說(shuō),如果我們想要使本地的一些Java類發(fā)布成一個(gè)Web Service,那在SCA容器中,只需要將這個(gè)Java類做成組件,然后再發(fā)布成Web服務(wù)綁定的Entry Point;同樣我們還可以把它發(fā)布成EJB的形式。更重要的是,如果我們?cè)贓ntry Point中,指定了多種Binding方式,那該組件服務(wù)就可以通過(guò)多種遠(yuǎn)程協(xié)議進(jìn)行訪問。
3.示例
為了證明Entry Point的確能夠幫助開發(fā)人員簡(jiǎn)單地發(fā)布Web 服務(wù),這里我們來(lái)一個(gè)示例工程。
示例工程代碼下載
。
準(zhǔn)備工作:
下載WTP 1.0
,
下載Balto SCA
。
首先我們將下載好的Balto SCA容器釋放到某處,然后在WTP的首選項(xiàng)中,找到Server項(xiàng),然后添加一個(gè)Tomcat 5.5 Runtime,路徑指向剛才釋放的Balto SCA的地方:

小貼士:在上一篇文章《ExternalService應(yīng)用》中我已經(jīng)提到了,Balto?SCA是整合了Tomcat,Balto本身就是一個(gè)Tomcat容器,只是修改了Tomcat的一些信息,能對(duì)部署的Web應(yīng)用進(jìn)行SCA方面的一些管理,所以使用Balto?SCA就像使用Tomcat一樣。
在WTP中新建一個(gè)動(dòng)態(tài)Web工程,取名為balto_entrypoint_test
然后我們建立一個(gè)接口Cat:
@Remotable
public
?
interface
?Cat?{
????
int
?getAge();
????
????
float
?getWeight();
????
????String?getName();
????
????AppearanceTypeImpl?getAppearance();
????
????String?callingIt(String?name);
}
注意,該接口我們利用了SCA的Remotable標(biāo)簽進(jìn)行標(biāo)識(shí),這是因?yàn)锽alto?容器中,對(duì)Entry?Point所指定的組件接口是有一定要求的,該要求就是要這個(gè)組件是一個(gè)遠(yuǎn)程的,所以這里我們需要構(gòu)建一個(gè)Remotable的組件接口
接下來(lái)我們做一個(gè)類MyCat,實(shí)現(xiàn)Cat接口,并且指明該MyCat是一個(gè)組件,而服務(wù)則接口則是Cat接口,也就是在MyCat類上標(biāo)明@Service 標(biāo)簽(不明白的讀者可以看SCA程序設(shè)計(jì)第一篇文章 《本地服務(wù)》)
@Service(Cat.
class
)
public
?
class
?MyCat?
implements
?Cat?{
????
public
?
int
?getAge()?{
????????
return
?
1
;
????}
????
public
?
float
?getWeight()?{
????????
return
?
10.89f
;
????}
????
public
?String?getName()?{
????????
return
?
"
DuoDuo
"
;
????}
????
public
?AppearanceTypeImpl?getAppearance()?{
????????AppearanceType?app?
=
?AppearanceFactory.eINSTANCE.createAppearanceType();
????????
????????EyesType?eyes?
=
?AppearanceFactory.eINSTANCE.createEyesType();
????????
????????CoatType?coat?
=
?AppearanceFactory.eINSTANCE.createCoatType();
????????
????????eyes.setColor(
"
Deep?Blue
"
);
????????
????????coat.setColor(
"
White
"
);
????????coat.setHeight(
"
Height
"
);
????????
????????app.setCoat(coat);
????????app.setEyes(eyes);
????????
return
?(AppearanceTypeImpl)app;
????}
????
public
?String?callingIt(String?name)?{
????????
return
?
"
Hello?
"
?
+
?name?
+
?
"
?,?MIAO~~~
"
;
????}
}
好了,上面的創(chuàng)建好的Cat接口以及MyCat實(shí)現(xiàn)類,已經(jīng)為我們的整個(gè)SCA模塊生成了一個(gè)可用的Component了。
Balto在解析Java Annotation的時(shí)候,如果發(fā)現(xiàn)了@Service標(biāo)簽,就會(huì)主動(dòng)將這個(gè)類注冊(cè)成為一個(gè)Component,并且,該Component的名字是它對(duì)應(yīng)的服務(wù)接口的名字,這里也就是Cat。
接下來(lái)就是要將這個(gè)Component接到Entry Point上,并通過(guò)Web服務(wù)發(fā)布出去。
在工程的src下新建一個(gè)sca.module文件(必須在src下),我們?cè)谖募袑懭耄?/font>
<?
xml?version="1.0"?encoding="ASCII"
?>
<
module?
xmlns
="http://www.osoa.org/xmlns/sca/0.9"
????xmlns:v
="http://www.osoa.org/xmlns/sca/values/0.9"
????name
="balto_entryPoint_test"
>
????
<
entryPoint?
name
="Cat"
>
????????
<
interface
.java?interface
="org.uxteam.balto.test.Cat"
?
/>
????????
<
binding
.ws
????????????port
="http://localhost:8080/balto_entrypoint_test/sca/services/LookingCat?
????????????????? wsdl#wsdl.endpoint(LookingCatService/LookingCatServiceSOAPBinding)"
?
/>
????????
<
reference
>
Cat
</
reference
>
????
</
entryPoint
>
</
module
>
這個(gè)就是我們所定義的Entry Point:
Web服務(wù)名 : Cat
interface:java接口,接口類是Cat接口
binding :Web服務(wù)綁定,但后面port給出的信息在目前的Balto版本中是不會(huì)關(guān)心的。
reference:指定了我們剛才建立的Cat組件。
現(xiàn)在我們打開WTP的Server視圖:

新建一個(gè)Server,Runtime就是我們的Balto,然后再將剛做的balto_entrypoint_test工程加入到server中,啟動(dòng)!
我們會(huì)發(fā)現(xiàn)在控制臺(tái)打出了一些信息,如果沒有發(fā)生異常,Balto SCA容器就算是啟動(dòng)成功了:

測(cè)試Web服務(wù)
我們現(xiàn)在需要測(cè)試一下發(fā)布出去的Web服務(wù)是否能用。
首先,打開WTP的Web服務(wù)測(cè)試Web頁(yè)面:
然后選擇WSDL Page項(xiàng),我們會(huì)發(fā)現(xiàn)一下的一個(gè)界面,在文本中輸入:
http://localhost:8080/balto_entrypoint_test/sca/services/Cat?wsdl
小貼士:Balto容器在處理Web服務(wù)使用的是Axis2,也就是說(shuō)純粹的是通過(guò)Axis2的Servlet來(lái)處理Web服務(wù)請(qǐng)求的,所以,Balto在Web應(yīng)用啟動(dòng)的階段,為這些輸入SCA管理范圍內(nèi)的Web應(yīng)用,動(dòng)態(tài)加入了Axis2,而由于目前Balto并不完善,所以在處理Servlet-Mapping的時(shí)候,都默認(rèn)給出了“/sca/services”做為Web服務(wù)映射的URL。從上面這段URL可以看出,這是一個(gè)請(qǐng)求WSDL文檔的URL。
點(diǎn)擊GO后我們發(fā)現(xiàn)在頁(yè)面左側(cè)出現(xiàn)了一個(gè)樹形結(jié)構(gòu)的東西。點(diǎn)開它,呵呵,看見了沒,我們發(fā)布的Web服務(wù)方法全在這兒呢。

隨便選擇一個(gè),然后在右側(cè)輸入?yún)?shù)后點(diǎn)擊GO。成功后在Status中我們可以點(diǎn)開Source,查看一下返回的SOAP相信信息。我們拿callIt做個(gè)例子:

信息準(zhǔn)確無(wú)誤,成功了。
4.小結(jié)
我們這里所提到的Entry Point是在SCA 0.9規(guī)范中給出了,而在0.9版本后,Entry Point已經(jīng)改名了.
通過(guò)Entry Point這種"暴露服務(wù)"方式,開發(fā)人員能夠很容易地將自己的Component注冊(cè)成為一個(gè)遠(yuǎn)程可用的服務(wù),這正是SOA中所提出的那樣:服務(wù)是可運(yùn)行在獨(dú)立節(jié)點(diǎn)上的,利用規(guī)范的接口描述,讓消費(fèi)者能夠在任何地方訪問到.SCA中所提出的Entry Point其實(shí)就是一個(gè)獨(dú)立服務(wù)的訪問入口,所以在SCA規(guī)范的0.9版本以后Entry Point這個(gè)名詞就沒有再沿用,而是支持將它改為了Service,這更能準(zhǔn)確地表明它的性質(zhì)吧.
本文中并沒有具體講解如何使用XSD中的復(fù)雜類型來(lái)作為Web服務(wù)中的類型,但示例工程中是有的,有興趣的朋友可以看一看.
本人文筆有限,有什么不對(duì)的地方還請(qǐng)大家指出,謝謝收看,再見。