百科解釋
Service Logic Execution Environment -- 業(yè)務(wù)邏輯執(zhí)行環(huán)境 SLEE 是一個(gè)容器標(biāo)準(zhǔn),目標(biāo)是提供移動(dòng)技術(shù)與企業(yè)技術(shù)之間的整合。該標(biāo)準(zhǔn)類(lèi)似于 EJB,不過(guò)是用于各種面向事件的應(yīng)用程序,例如 IP 電話(huà)服務(wù)、分布式交互模擬/監(jiān)控/控制等。Mobicents 是第一個(gè)而且是目前唯一開(kāi)源并被 JAIN SLEE 1.0 認(rèn)定的產(chǎn)品,它從交換協(xié)議構(gòu)造上基于 JAIN-SIP。 前言 Mobicents 是一個(gè)專(zhuān)業(yè)開(kāi)源的 VoIP 中間件平臺(tái)。Mobicents 是第一個(gè)而且是目前唯一開(kāi)源并被 JAIN SLEE 1.0 認(rèn)定的產(chǎn)品,它從交換協(xié)議構(gòu)造上基于 JAIN-SIP。 JAIN SLEE 是一個(gè)以事件為驅(qū)動(dòng)的中間件,采用了各個(gè)服務(wù)單元(Sbb)消息機(jī)制,減少了在事物處理上的等待延遲,其工作方式是從外部協(xié)議資源掃描事件狀態(tài),然后將這些事件遞交到各個(gè)處理單元去,可以以它為核心設(shè)計(jì)成網(wǎng)關(guān)和網(wǎng)守,軟交換上層的應(yīng)用服務(wù)器,媒體服務(wù)器等多種設(shè)備,同時(shí)適配多種交換協(xié)議。 以下分成 10 個(gè)部分來(lái)對(duì) Mbicents-SLEE 進(jìn)行詳細(xì)介紹: 1. 資源適配器(Resource Adaptor)體系; 2. JAIN-SIP; 3. 事件和事件類(lèi)型(Events),事件引導(dǎo)(Routing); 4. 行為實(shí)體(Activity)和行為實(shí)體上下文(Activity Context); 5. SBB部件和SBB實(shí)體; 6. 數(shù)據(jù)供應(yīng)(Provisioned Data); 7. SLEE的一些工具(facility); 8. 服務(wù)和部署(Service and Deployment); 9. 應(yīng)用范例(SIP代理服務(wù)器,信令網(wǎng)關(guān)); 10. 使用elipslee來(lái)進(jìn)行SBB的開(kāi)發(fā); 下面展示了Mobicents Docs中的一個(gè)體系分布圖: 圖1 . SLEE的體系分布圖 1> SBB 服務(wù)管理單元(Sbb Service Management):這個(gè)部分面向上層的應(yīng)用,也就是 Service Block Building 的構(gòu)造和部署的主要部分,其中包含了對(duì)象持久性(Persistence),類(lèi)似 EJB 的CMP 一樣,對(duì)數(shù)據(jù)對(duì)象的持久性(包括生存期和數(shù)據(jù)庫(kù)連接等等)由 SLEE 容器自動(dòng)完成的,SBB 分成 Sbb 實(shí)體和 Sbb 對(duì)象兩個(gè)組成。對(duì)整個(gè) Sbb 的服務(wù)管理單元來(lái)說(shuō),包含有 Sbb 工廠(chǎng),持久性管理,Sbb 對(duì)象池管理,服務(wù)部署者,這些對(duì)于實(shí)際的使用者而言是不可見(jiàn)的。用戶(hù)的應(yīng)用部署文件是 sbb.jar,而用戶(hù)服務(wù)描述是 service.xml。 2> Sbb 運(yùn)行環(huán)境(Sbb Runtime):Sbb 運(yùn)行環(huán)境就是Sbb的執(zhí)行體,核心是事件導(dǎo)向單元--Event Router,(獲得事件并且分配導(dǎo)入到指定的 Sbb 中去),SLEE 端點(diǎn)管理(連接資源適配器產(chǎn)生事件送達(dá)端點(diǎn)),通過(guò)上下文(Context)方式來(lái)實(shí)現(xiàn)各個(gè)實(shí)體之間的聯(lián)系(參看圖7),和 Sbb服務(wù)管理單元之間的接口是 ActivityContext(以下為活躍實(shí)體或者行為實(shí)體上下文),用于表示獨(dú)立的事件接口;和資源適配器之間的接口是 Activity,也就是行為實(shí)體,具體事件的封裝,例如 SIP 的注冊(cè)事件(SIP Register),這個(gè)事件會(huì)引發(fā) Sbb 的相關(guān)注冊(cè)服務(wù)(例如 RegisteraSbb);另一個(gè)接口是 SLEE Activity,這個(gè)是 SLEE 內(nèi)部的行為實(shí)體,例如一些內(nèi)部的工具產(chǎn)生的行為實(shí)體,例如定時(shí)器事件(Timer Event)和用于調(diào)試的 Trace 事件。 3> SLEE 的一些工具:和 J2EE 中的工具一樣,提供了一些工具來(lái)使用,工具在 SLEE 中的定義是一些標(biāo)準(zhǔn)的功能組件,他們的提供了一些預(yù)定義的接口為應(yīng)用提供服務(wù),其中包括了Adress,Profile,Alarm,Naming。 4> 資源適配器(RA),用于具體的協(xié)議在SLEE上的封裝,例如(SCAP,SS7,SIP,MGCP,H.323)當(dāng)然也可以是自己的私有協(xié)議,封裝的方式可以參看Mobicents官方網(wǎng)站的一些介紹,協(xié)議和SLEE Run-time的接口就是具體的行為實(shí)體,也就是事件的封裝, 用戶(hù)定義的資源適配器部署文件是RA.jar在本文中SIP資源適配器的部署文件是sip-local-ra.jar和sip-type-ra.jar。 一. 資源適配器(Resource Adaptor)體系 1.Mobicents資源適配器的概述以及定義和應(yīng)用模式: 備注:Mobicents 中的資源適配器提供了非常方便的接口以便實(shí)現(xiàn)各種協(xié)議資源在 SLEE 上的組裝,目前在 1.0a 和 1.0b中都只完成了 SIP 協(xié)議和 TCAP 協(xié)議,事實(shí)上后者的意義在于將 SIP 模擬作為 NSP 層而采用的應(yīng)用層協(xié)議。 資源適配器主要是指的網(wǎng)絡(luò)設(shè)備和協(xié)議棧本身,和狀態(tài)機(jī)的有連接協(xié)議,例如我們?cè)谙旅鎸⒃敿?xì)介紹的JAIN-SIP 以及其他支持JAVA語(yǔ)言的呼叫代理協(xié)議, JCC API,Parlay/OSA 等。 資源適配器分成三個(gè)范疇, a. 資源適配器類(lèi)型(Resource adaptor type); b. 資源適配器對(duì)象; c. 資源適配器實(shí)體(entity); 2. 協(xié)議棧的資源在 SLEE 上的綁定: 在 Mobicents1.0a 上綁定了兩個(gè)資源實(shí)體就是 JAIN-SIP 的資源實(shí)體(SIpRA),和 JAIN SLEE TCK,下面我們根據(jù)它的第三方范例 (Third-Party) 注冊(cè)機(jī)(Registar)來(lái)簡(jiǎn)單介紹它的資源綁定模式: 首先是協(xié)議棧描述,就是 SIP 在 Sbb 服務(wù)上的描述,在 sbb-jar.xml 文件中會(huì)體現(xiàn),這個(gè)文件是 SBB 的部署文件,可以理解為 J2EE 中的 ejb-jar.xml 文件。 如Registrar中的: <resource-adaptor-type-binding> <resource-adaptor-type-ref> <resource-adaptor-type-name>jain-sip</resource-adaptor-type-name> //JAIN SIP的資源適配器類(lèi)型 <resource-adaptor-type-vendor>javax.sip</resource-adaptor-type-vendor> <resource-adaptor-type-version>1.1</resource-adaptor-type-version> </resource-adaptor-type-ref> 在JNDI中的實(shí)體上下文工廠(chǎng)的綁定,SBB的開(kāi)發(fā)者通過(guò)lookup來(lái)調(diào)用 <activity-context-interface-factory-name> slee/resources/jainsip/1.1/acifactory </activity-context-interface-factory-name> 定義了SBB所依靠的一個(gè)定義資源適配器對(duì)象名稱(chēng)在JNDI上綁定的類(lèi)型 <resource-adaptor-entity-binding> <resource-adaptor-object-name> slee/resources/jainsip/1.1/provider </resource-adaptor-object-name> 定義了resource-adaptor-object-name中表示的資源實(shí)體對(duì)象SIPRA <resource-adaptor-entity-link> SIPRA </resource-adaptor-entity-link> </resource-adaptor-entity-binding> </resource-adaptor-type-binding> 其中: 資源適配器對(duì)象名稱(chēng)就是<resource-adaptor-object-name>slee/resources/jainsip/1.1/provider</resource-adaptor-object-name> 資源適配器實(shí)體的名稱(chēng)<resource-adaptor-entity-link>SIPRA </resource-adaptor-entity-link>,實(shí)體本身使用專(zhuān)門(mén)的工具DeploySipRA.sh將會(huì)對(duì)SIPRA進(jìn)行創(chuàng)建和部署,腳本中如下描述: call %JBOSS_HOME%inSleeCommandInterface.bat -createRaEntity "ResourceAdaptorID[jainsip#NIST#1.1]" SIPRA 類(lèi)型名稱(chēng)是:<resource-adaptor-type-name>jain-sip</resource-adaptor-type-name> 3.協(xié)議棧工廠(chǎng)的調(diào)用 : 在Sbb中調(diào)用lookup() 方法時(shí)都會(huì)執(zhí)行一次新查找獲得資源實(shí)體工廠(chǎng),這里會(huì)返回工廠(chǎng)實(shí)例SipFactoryProvider,<resource-adaptor-type-name>包含了SBB需要對(duì)資源實(shí)體訪(fǎng)問(wèn)時(shí)候需要訪(fǎng)問(wèn)的資源實(shí)體工廠(chǎng)名稱(chēng),例如: fp = (SipFactoryProvider) sbbEnv.lookup("slee/resources/jainsip/1.1/provider"); SIP協(xié)議工廠(chǎng),用于生產(chǎn)SIP的消息體(Message),SIP的頭(Header),SIP的JAIN-SIP的ServerTransaction/ClientTransaction(交易的狀態(tài)機(jī),和每次會(huì)話(huà)--Cseq對(duì)應(yīng)),SIP消息發(fā)送發(fā)送者和偵聽(tīng)事件的偵聽(tīng)點(diǎn)。 4.行為實(shí)體上下文工廠(chǎng)的調(diào)用: <activity-context-interface-factory-name>,這里是行為實(shí)體上下文工廠(chǎng)接口在JNDI上的綁定,目的是為了Sbb產(chǎn)生行為實(shí)體接口的,SBB通過(guò)lookup()方式訪(fǎng)問(wèn)行為實(shí)體上下文接口的環(huán)境入口,而行為實(shí)體上下文接口的工廠(chǎng)的接口(比較拗口,可以理解為一個(gè)對(duì)象工廠(chǎng)的接口就好了)是在<activity-context-interface-factory-interface-name>中體現(xiàn)出來(lái),在對(duì)SBB的服務(wù)進(jìn)行初始化時(shí)候,工廠(chǎng)和JNDI上綁定的名字相對(duì)應(yīng)(sbb-jar.xml中),如resource-adaptor-type-jar.xml中: <activity-context-interface-factory-interface-name> org.mobicents.slee.resource.sip.SipActivityContextInterfaceFactory </activity-context-interface-factory-interface-name> 查找一個(gè)行為實(shí)體上下文接口工廠(chǎng): acif = (SipActivityContextInterfaceFactory) myEnv.lookup("slee/resources/jainsip/1.1/acifactory") SBB需要對(duì)資源實(shí)體活動(dòng)體上下文接口工廠(chǎng)進(jìn)行訪(fǎng)問(wèn)獲得行為實(shí)體的接口,例如發(fā)送一個(gè)SIP的消息的有狀態(tài)消息(INVITE消息)那么sbb就需要獲得一個(gè)行為實(shí)體上下文接口,與創(chuàng)建的Sbb和這個(gè)行為實(shí)體接口綁定,維持這個(gè)有狀態(tài)會(huì)話(huà)。 關(guān)于行為實(shí)體的概念,是SLEE中的重要的概念,對(duì)于它的理解可以看作對(duì)應(yīng)于一個(gè)SIP的會(huì)話(huà)狀態(tài)機(jī),一般用SIP消息中的Branch ID作為一個(gè)"種子"來(lái)生成一個(gè)行為實(shí)體的狀態(tài)機(jī),根據(jù)這個(gè)會(huì)話(huà)將不同的事件導(dǎo)向到對(duì)應(yīng)的SBB中,在后續(xù)將詳細(xì)介紹,的上下文(ActivityContextInterface)是可以在Sbb間共享的,通過(guò)共享可以獲得消息的參數(shù),如via,to,from,contact,CallID,Cseq;在SLEE中規(guī)定定義一些Set/Get方法來(lái)對(duì)這些參數(shù)進(jìn)行訪(fǎng)問(wèn),參看注冊(cè)機(jī)中的RegistrarActivityContextInterface中的Set/Get接口方法。 二.JAIN-SIP的簡(jiǎn)單介紹 1.什么是JAIN-SIP: 綜合網(wǎng)絡(luò)的Java 應(yīng)用編程接口(JAIN,Java API for Integrated Networks)是一組基于Java技術(shù)的API,這些接口將業(yè)務(wù)可移植性、網(wǎng)絡(luò)聚合以及安全的網(wǎng)絡(luò)接入引進(jìn)電話(huà)網(wǎng)和數(shù)據(jù)網(wǎng)絡(luò),使得在Java平臺(tái)上快速開(kāi)發(fā)下一代電信產(chǎn)品和服務(wù)成為可能,在Mobicents中以Jain-sip作為Resource Adaptor。 在JAIN SIP API體系結(jié)構(gòu)中,為所有SIP消息的報(bào)頭定義了類(lèi),并借助提供者/監(jiān)聽(tīng)者接口,將用于處理報(bào)文的JavaBeans體系結(jié)構(gòu)的接口定義為事件。 Jain-SIP是一個(gè)標(biāo)準(zhǔn)的JAVA的SIP協(xié)議棧的interface,它分成以下幾個(gè)部分: a. 標(biāo)準(zhǔn)的協(xié)議棧的接口; b. 標(biāo)準(zhǔn)的SIP消息接口; c. 標(biāo)準(zhǔn)的SIP消息狀態(tài)機(jī)和事件的觸發(fā)。 2. 從JAIN-SIP到SLEE中的事件傳導(dǎo)機(jī)制: 以下仍然以Registar為例子簡(jiǎn)要介紹SLEE中對(duì)SIP消息(或者是事件)的管理以及處理句柄的調(diào)用。見(jiàn)圖2,分成事件和協(xié)議兩個(gè)部分: 事件部分:也就是RFC3261中的事件信息, REGISTER,INVITE等,EventRouter將事件導(dǎo)向到對(duì)應(yīng)的的SBB中的事件處理回調(diào)中去(onRegistar),processinitialevents被EventRouter調(diào)用,目的是找到處理對(duì)應(yīng)事件的SBB,RegisterSbb是處理對(duì)象的SBB。 協(xié)議部分:SIP Stack也就是協(xié)議棧的部分, SipResourceAdaptor是Resource Adaptor的SIP實(shí)例化,Event表示了當(dāng)前的SIP會(huì)話(huà)的行為實(shí)體,從這里可以獲得Jain-SIP的服務(wù)端會(huì)話(huà)交易用于處理偵聽(tīng)消息的處理句柄(在下面會(huì)有介紹),Event Type是JAIN-SIP消息類(lèi)型,EventObject是傳遞到SBB實(shí)體時(shí)候?qū)AIN-SIP消息進(jìn)行的封裝。 圖2.一個(gè)注冊(cè)機(jī)的事件交易過(guò)程 3.JAIN-SIP中的重要類(lèi)介紹: 1> Siplistener 概述: 這個(gè)類(lèi)代表SIP協(xié)議的負(fù)責(zé)偵聽(tīng)的應(yīng)用程序端,這個(gè)接口定義了一個(gè)偵聽(tīng)端,接收處理從SipProvider提交的SIP事件消息,是一個(gè)抽象的偵聽(tīng)線(xiàn)程。 結(jié)構(gòu): 每個(gè)SIPStack或每個(gè)IP地址對(duì)應(yīng)一個(gè)的Siplistener,而Siplistener與SipProvider的關(guān)系是一對(duì)多的關(guān)系。 2> SipFactory SIPFactory是一個(gè)單類(lèi),用單一方式得到這個(gè)SipStack應(yīng)用的執(zhí)行權(quán)。SIPFactory單一的實(shí)例能用得到實(shí)例的方法(或者Singleton)而被得到。通過(guò)在SIPFactory里調(diào)用合適構(gòu)造方法,一個(gè)代表被叫端的對(duì)象能從SIPFactory得到。創(chuàng)造一個(gè)被叫的SipStack,這樣應(yīng)用將可以調(diào)用SipStack中的方法。 3> ServerTransaction 概述: ServerTransaction可以通常被理解為一個(gè)會(huì)話(huà)狀態(tài)機(jī),SipProvider用來(lái)處理接收SIP事件和消息序列,將接收到消息發(fā)送到SipListener(偵聽(tīng)方法)的processRequest或者processResponse回調(diào),通過(guò)用戶(hù)代理服務(wù)器發(fā)送回應(yīng)信息給應(yīng)用程序。這個(gè)類(lèi)讓?xiě)?yīng)用程序能發(fā)送一個(gè)回應(yīng)對(duì)應(yīng)SipListener收到的請(qǐng)求。 方法: ServerTransaction中的方法: sendResponse 應(yīng)用希望發(fā)送一個(gè)響應(yīng)時(shí)候,它創(chuàng)立一個(gè)來(lái)自MessageFactory創(chuàng)造的回應(yīng),然后回應(yīng)傳送到ServerTransaction的sendResponse方法。 4> ClientTransaction 概述: ClientTransaction應(yīng)用可以理解為發(fā)送INVITE信息到UAS。ClientTransaction也用從SipListener接收到的回應(yīng)進(jìn)行匹配。和ServiceTransaction相對(duì)應(yīng)。 方法: ClientTransaction的方法: Request createAck() 通過(guò)ClientTransaction創(chuàng)造一個(gè)關(guān)于當(dāng)前的請(qǐng)求的正確應(yīng)答。 void sendRequest()用于發(fā)送創(chuàng)建的請(qǐng)求消息。 這個(gè)類(lèi)的調(diào)用意味著上層的應(yīng)用是UAC。 圖3. JAIN SIP 結(jié)構(gòu)和狀態(tài)機(jī)體系 圖4 JAIN-SIP,Resource Adaptor以及SbbEntity之間調(diào)用關(guān)系 回頁(yè)首 三. 事件和事件類(lèi)型(Events),事件引導(dǎo)(Routing): 1. 事件和事件類(lèi)型: 在SLEE中和資源適配器中,事件代表外部到達(dá)的消息,向外部發(fā)送的消息,某些狀態(tài)的遷移(例如定時(shí)器的時(shí)間到),其他的SBB使用Activity Context共享狀態(tài)。這就減少了SBB實(shí)體間直接對(duì)事件的調(diào)用,其他的SBB實(shí)體可以對(duì)事件達(dá)到同時(shí)處理,這個(gè)是和EJB最大的不同的地方。 2. 事件源: a 外部的協(xié)議棧資源(SS7 stacks, SIP stacks,記費(fèi)系統(tǒng) ...,Profile觸發(fā)) b SLEE的服務(wù)容器內(nèi)的部件(定時(shí)器、服務(wù)觸發(fā)、數(shù)據(jù)源觸發(fā)) c 自定義的觸發(fā)源(自定義事件) 3.SLEE中的事件描述: 在有多個(gè)資源的時(shí)候,這些資源所觸發(fā)的事件都是放在event-jar.xml和slee-event-jar.xml兩個(gè)文件中的, 而SBB所感興趣的事件,則放在sbb-jar.xml中定義了,以及還包括了一些Sbb需要知道的消息細(xì)節(jié),例如消息方向,觸發(fā)順序和初始化參數(shù): <event event-direction="Receive" initial-event="True"> <event-name>RegisterEvent</event-name> <event-type-ref> <event-type-name>javax.sip.message.Request.REGISTER</event-type-name> <event-type-vendor>javax.sip</event-type-vendor> <event-type-version>1.1</event-type-version> </event-type-ref> <initial-event-select variable="ActivityContext" /> </event> initial-event表示初始事件,也就是事件會(huì)觸發(fā)實(shí)例化一個(gè)根Sbb,Root Sbb,就是說(shuō)這個(gè)消息可能是一個(gè)消息狀態(tài)機(jī)中的第一個(gè)消息。Root Sbb定義在后續(xù)章節(jié)會(huì)更加詳細(xì)的看到。 event-direction表示事件是發(fā)出(Fire)還是接收(Receive)來(lái)觸發(fā)SBB. event-type-ref這里表示的相關(guān)事件的類(lèi)型單元,其中event-type-name為事件的名字。 4.SLEE中的事件處理過(guò)程: 在SBB中的事件處理句柄是在事件用"On"+ event-name表示,例如在注冊(cè)機(jī)例子中的RegiterEvent的處理句柄為OnRegisterEvent。 帶入?yún)?shù): "on"+<event name>(<event class> event,<SBB Activity Context Interface interface> activity) 行為實(shí)體<SBB Activity Context Interface interface> activity和<event class> event: SBB對(duì)象作為一個(gè)事件消費(fèi)者通過(guò)行為實(shí)體了解事件,activity是帶入處理句柄的一個(gè)參數(shù),是代表行為實(shí)體的接口activity interface,關(guān)于行為實(shí)體的一些來(lái)歷在前面做了介紹。從行為實(shí)體接口可以獲得從對(duì)端發(fā)送的消息;從一個(gè)Mobicents中的Activity可以獲得一個(gè)行為實(shí)體的調(diào)用--ServerTransaction, 另外一個(gè)帶入的參數(shù)是這個(gè)SBB實(shí)體感興趣的消息,這個(gè)消息是被SLEE自動(dòng)導(dǎo)入到SBB中去的,這個(gè)消息事件是JAIN-SIP中javax.sip.RequestEvent包的消息類(lèi),從這個(gè)類(lèi)中可以得到SIP消息的一些具體信息。 圖5 Sbb和活躍實(shí)體以及上下文之間的關(guān)系圖 回頁(yè)首 四.行為實(shí)體(Activity)和行為實(shí)體上下文(Activity Context) 1.行為(Activity): 在SLEE中對(duì)行為如下定義:一個(gè)相關(guān)事件流的抽象,也是一個(gè)根據(jù)狀態(tài)變化而發(fā)出事件的有限狀態(tài)機(jī) 2. 實(shí)體上下文(Activity Context) SLEE中定義一個(gè)ActivityContext是資源實(shí)體在SLEE中的表現(xiàn),SBB實(shí)體從ActivityContext中獲得事件,可以把它理解為一個(gè)事件總線(xiàn),SBB要獲得事件需要綁定到事件總線(xiàn)上去,SBB實(shí)體根據(jù)它綁定的不同的實(shí)體上下文獲得事件觸發(fā)相應(yīng)的動(dòng)作,并且做出相應(yīng)的響應(yīng)動(dòng)作;而實(shí)體上下文接口(ActivityContextInterface)就是也就是SBB對(duì)實(shí)體訪(fǎng)問(wèn)的接口,在使用過(guò)程當(dāng)中Sbb一般會(huì)根據(jù)定義自己的狀態(tài)在ActivityContextInterface上增加一個(gè)封裝。 3.范例: 下面我們看以下SIP Registrar中實(shí)體和實(shí)體上下文的例子: 1> 對(duì)于一個(gè)JAIN-SIP的協(xié)議棧實(shí)體來(lái)說(shuō),實(shí)體對(duì)象是ServerTransaction和ClientTransaction(參看圖5),這兩個(gè)交易是針對(duì)特定呼叫的,每個(gè)呼叫指定一個(gè)特定對(duì)象。 一個(gè)新的SIP呼叫--Register消息進(jìn)入SLEE,這個(gè)呼叫被某個(gè)Sbb所感興趣, 2> SIP呼叫實(shí)體傳遞一個(gè)SIP的消息(REGISTER)通過(guò)ActivityContext傳遞到SBB實(shí)體中去,由onRegisterEvent(RequestEvent event, ActivityContextInterface ac)來(lái)進(jìn)行處理, 3> 從ActivityContextInterface獲得實(shí)體ServerTransaction: ServerTransaction serverTransactionId = (ServerTransaction)ac.getActivity(); 4> 從SBB中根據(jù)這個(gè)狀態(tài)機(jī)創(chuàng)建一個(gè)新的SIP呼叫,并且發(fā)送這個(gè)請(qǐng)求: this.clientTransaction = sipProvider. getNewClientTransaction(request); clientTransaction.sendRequest(); 5> 為了接收這個(gè)呼叫中一些消息的內(nèi)容,需要綁定當(dāng)前的SBB實(shí)體到ActivityContext接口上,為了將當(dāng)前SBB行為實(shí)體上下文和SIP的行為實(shí)體上下文接口結(jié)合起來(lái),SLEE規(guī)范中提供了一個(gè)asSbbActivityContextInterface方法將SIP(或者其他)的行為實(shí)體的接口作為參數(shù)帶入到SBB的行為實(shí)體上下文中,才可以作為提供了一個(gè)SBB可以訪(fǎng)問(wèn)的共享行為實(shí)體上下文: ActivityContextInterface aci=SipActivityContextInterfaceFactory.getActivityContextInterface() RegistrarActivityContextInterface regACI = asSbbActivityContextInterface(aci) //以下是對(duì)SIP消息頭的設(shè)定,將該特定的SIP消息和ActivityContextInterface綁定起來(lái), 便于Sbb實(shí)體進(jìn)//行跟蹤,例如針對(duì)該消息的超時(shí)事件,這個(gè)在注冊(cè)機(jī)例子中有詳細(xì)的使用過(guò)程, regACI.setSipAddress(sipAddress); regACI.setSipContactAddress(sipContactAddress); // callId and cseq used to identify a particular registration regACI.setCallId(callId); regACI.setCSeq(cseq); regACI.attach(getSbbLocalObject()); 五.SBB部件和SBB實(shí)體 1. SBB實(shí)體定義: 1> SBB定義為服務(wù)組件,封裝了服務(wù)邏輯和相關(guān)的觸發(fā)狀態(tài)。 2> SBB組件需要包含: a> Sbb組件產(chǎn)生或者是接收的事件。 b> 單個(gè)實(shí)例化的狀態(tài):每個(gè)實(shí)例化域的狀態(tài)都被收錄到SLEE集中管理的CMP容器 c> 事件處理句柄: Sbb組件中包含的,每個(gè)它所接收到的事件類(lèi)型的一個(gè)事件處理方法。 d> 本地接口:Sbb中定義一個(gè)Sbb本地接口,它定義有可能同步被調(diào)用的Sbb組件(是在同一個(gè)SBB Tree上生成的Sbb才可調(diào)用的接口,下面也將詳細(xì)介紹)的操作。 e> 子關(guān)系成分:SBB成分可能包括零個(gè)或者多個(gè)子SBB組件 f> 可共享性:SBB組件通過(guò)Activity Context的方式與其他SBB組件共享狀態(tài),SBB組件定義。 g> 一個(gè)JAVA接口(Activity Context Interface),這個(gè)接口定義為了得到和設(shè)置這些特性所進(jìn)行的安全訪(fǎng)問(wèn)操作。 例子: 在Mobicents中有一個(gè)簡(jiǎn)單的SIP代理網(wǎng)關(guān)范例JainSipProxySbb可以參看,和前面所說(shuō)的RegistrarSbb做為它的子Sbb,可以通過(guò)他們來(lái)了解整個(gè)Sbb構(gòu)造。 2. 根SBB和子SBB a.SBB 實(shí)體(Sbb Entity) SBB實(shí)體是SBB組成的一個(gè)實(shí)例。SBB實(shí)體是一個(gè)代表著實(shí)例持久性狀態(tài)的實(shí)體。 b.SBB子實(shí)體和根SBB實(shí)體的定義 在運(yùn)行時(shí)間內(nèi),SBB實(shí)體可能創(chuàng)造多個(gè)SBB子實(shí)體。由于SBB實(shí)體可能被創(chuàng)造,所以它是一個(gè)單一的父目錄。以圖6為例SBB實(shí)體子目錄是一個(gè)被管理的非循環(huán)的樹(shù)形表。 圖6詳細(xì)說(shuō)明了父和子Sbb之間的關(guān)系,它也顯示了SLEE是所有根SBB實(shí)體合理的父親。 在SLEE中定義,在父的SBB訪(fǎng)問(wèn)子SBB采用"獲得子SBB關(guān)系對(duì)象"的方法,父的SBB實(shí)體使用getSBBLocalObject從SbbContext對(duì)象中,獲得一個(gè)SBB的本地對(duì)象,父SBB實(shí)體也將這個(gè)本地的SBB對(duì)象傳遞到的子SBB中去,例如某些情況下,在子SBB的本地接口中定義一個(gè)方法給父SBB用來(lái)傳遞消息到子SBB中去。 下面我們用一個(gè)簡(jiǎn)單的子SBB的例子來(lái)說(shuō)明這個(gè)問(wèn)題,請(qǐng)參看ProxyBaseProxySbb.java 在這里父 SBB 是 BaseProxySbb 中處理各種 SIP 呼叫的消息,其中對(duì) Register 事件的消息是由子 SBB Registera 來(lái)進(jìn)行處理這個(gè) SIP 消息的,換句話(huà)來(lái)說(shuō),有一個(gè)子的 SBB 應(yīng)用嵌入在父 SBB BaseProxySbb 處理中。 1> 父 Sbb 獲得子 Sbb 的關(guān)系: public void onRegisterEvent(RequestEvent event, ActivityContextInterface ac) { getDefaultSbbUsageParameterSet().incrementNumberOfRegister(1); trace(Level.INFO, "Received REGISTER request, class="+event.getClass()); try { // is local domain? //在父SBB中了使用了一個(gè)方法來(lái)創(chuàng)建子的SBB關(guān)系,然后并且通過(guò)這個(gè)子關(guān)系創(chuàng)建子SBB的本地對(duì)象,這個(gè) //本地對(duì)象提供了子SBB可以調(diào)用的方法,而且這個(gè)子SBB在sbb-jar.xml 中需要對(duì)這個(gè)獲得子SBB的方法進(jìn)行 //定義 ChildRelation relation = getRegistrarSbbChild(); … … 2> 子Sbb在sbb-jar.xml中的定義 子SBB在sbb-jar.xml中需要對(duì)這個(gè)獲得子SBB的方法進(jìn)行定義: <sbb-classes> <sbb-abstract-class> <sbb-abstract-class-name> com.opencloud.slee.services.sip.proxy.JainSipProxySbb </sbb-abstract-class-name> 父SBB使用這個(gè)方法來(lái)創(chuàng)建子SBB實(shí)體, <get-child-relation-method> 定義了子SBB,這里表示最后調(diào)用的子SBB為RegisteraSbb <sbb-alias-ref>RegistrarSbb</sbb-alias-ref> 定義了獲得子關(guān)系的方法名字,調(diào)用這個(gè)方法可以得到SBB子關(guān)系,通過(guò)調(diào)用子關(guān)系可以創(chuàng)建這個(gè)子SBB的本地對(duì)象 <get-child-relation-method-name>getRegistrarSbbChild</get-child-relation-method-name> <default-priority>0</default-priority> </get-child-relation-method> … 3> 創(chuàng)建一個(gè)子 Sbb 的調(diào)用過(guò)程: SBB 的開(kāi)發(fā)者的 SBB 調(diào)用方法一般如下,例如對(duì)當(dāng)前 Reigster 事件的 ChildRelation 創(chuàng)建(creat)方法的調(diào)用,得到一個(gè)新的 SBB 實(shí)體,在調(diào)用過(guò)程中 Registera 的 sbbCreate 將被調(diào)用,這里和一個(gè)常見(jiàn)的 SBB 實(shí)體創(chuàng)建過(guò)程基本相同,返回的是一個(gè)以 SbbLocalObject 接口的 SBB 實(shí)體: Public class RegistrarChildRelation implements ChildRelation { Public sbblocalobject creat() … { SbblocalObject local=RegisteraSbbLocalObject(); Return local ;} } 4> 一個(gè)應(yīng)用中的創(chuàng)建并且使用子 SBB 的方法: 調(diào)用子關(guān)系的創(chuàng)建方法,得到子 SBB 的實(shí)體 … … SbbLocalObject child = relation.create(); //將當(dāng)前的子SBB綁定到當(dāng)前的行為實(shí)體上下文上去; // attach child to this activity ac.attach(child); //把父實(shí)體從當(dāng)前的上下文上分離出去; // detach myself ac.detach(getSbbLocalObject()); // 這樣后續(xù)的消息處理都被重定向到RegisterSbb上去了。 …. … } catch (Exception e) { trace(Level.WARNING, "Exception during onRegisterEvent", e); } } 從上述例子也可以看到事件優(yōu)先權(quán)的問(wèn)題,在事件傳送過(guò)程中,父SBB實(shí)體總是在它的子SBB實(shí)體前接收同樣的事件。SBB實(shí)體的事件傳遞優(yōu)先權(quán)決定了同級(jí)別SBB實(shí)體接收事件的順序,另外在SLEE的各個(gè)實(shí)體關(guān)系中,SBB實(shí)體的事件傳送優(yōu)先權(quán)可能被改變。 3. 事件傳送優(yōu)先權(quán) 對(duì)于實(shí)體序列來(lái)說(shuō)。父SBB實(shí)體總是在它的子SBB實(shí)體前接收同樣的事件。對(duì)于優(yōu)先級(jí)的定義大家可以參看規(guī)范中的8.5.7部分,要改變優(yōu)先級(jí)的時(shí)候會(huì)在SbbLocalObject接口的setSbbPriority方法。 4. SBB 實(shí)體之間的并行刪除: SBB實(shí)體可以刪除,通過(guò)在SbbLocalObject 接口或ChildRelationObject接口調(diào)用刪除的方法。當(dāng)執(zhí)行刪除時(shí)候,SLEE將會(huì)刪除SBB的實(shí)體和所有SBB父實(shí)體后代。 5. SBB 對(duì)象 SBB對(duì)象是SBB所擴(kuò)展的抽象類(lèi)SLEE之一個(gè)實(shí)例,和SBB實(shí)體所不同的是SBB的實(shí)體是邏輯的實(shí)體,而SBB對(duì)象則是一個(gè)JAVA的對(duì)象,可以被實(shí)際調(diào)用的。 6. SBB 本地接口和 SBB 本地對(duì)象 每個(gè)SBB有一個(gè)SBB本地接口。SBB的SBB本地接口是一個(gè)指定的SBB本地界面,它是由SBB開(kāi)發(fā)者根據(jù)SbbLocalObject接口來(lái)進(jìn)行擴(kuò)展的。 SBB對(duì)象通過(guò)SbbLocalObject同步地調(diào)用目標(biāo)SBB實(shí)體的SBB對(duì)象,因此可以理解SbbLocalObject就是一個(gè)Sbb對(duì)象的實(shí)例,這樣使用者可以通過(guò)GetSbbLocalObect方法獲得相關(guān)的目標(biāo)對(duì)象,并且得到它的調(diào)用方法。本質(zhì)上,SBB本地對(duì)象是一個(gè)應(yīng)用SBB本地對(duì)象接口和代表目標(biāo)SBB實(shí)體的執(zhí)行對(duì)象。當(dāng)SBB對(duì)象在SbbLocalObject上調(diào)用SBB開(kāi)發(fā)者定義的方法時(shí),在Sbb抽象類(lèi)中的相關(guān)方法將被Sbb對(duì)象進(jìn)行調(diào)用。另外,Sbb本地對(duì)象可以在遠(yuǎn)程過(guò)程調(diào)用的時(shí)候作為一個(gè)客戶(hù)存根對(duì)象。本質(zhì)上來(lái)說(shuō)Sbb的本地接口從提供了對(duì)SbbLocalObject的調(diào)用能力,通過(guò)SbbLocalObject訪(fǎng)問(wèn)到相對(duì)應(yīng)的SBB實(shí)體,這個(gè)很有點(diǎn)和EJB的本地接口類(lèi)似。 7.SBB 的生命對(duì)象周期 當(dāng) SLEE 采用 newIstance 創(chuàng)建一個(gè) SBB,這個(gè)時(shí)候 sbb 對(duì)象生命周期就開(kāi)始了,這個(gè)時(shí)候緩沖Sbb對(duì)象,調(diào)用setsbbContext將sbbContext(也就是Sbb的上下文)對(duì)象傳入Sbb對(duì)象中,此時(shí)SIP消息工廠(chǎng)對(duì)象或者是地址工廠(chǎng),以及SIP棧的提供者(SipProvidor)這些的對(duì)象的創(chuàng)建都在setSbbContext回調(diào)中進(jìn)行。 當(dāng)完成了實(shí)例化的過(guò)程以后,sbb對(duì)象將進(jìn)入對(duì)象池,每個(gè)Sbb組件都有自己的對(duì)象池,例如RegistraSbb對(duì)象會(huì)進(jìn)入自己的對(duì)象池中,但這個(gè)時(shí)候Sbb對(duì)象還不和任何Sbb實(shí)體相關(guān)聯(lián)。 當(dāng)一個(gè)Sbb接收到一個(gè)事件并且開(kāi)始進(jìn)程處理過(guò)程,而某個(gè)業(yè)務(wù)邏輯調(diào)用主動(dòng)調(diào)用這個(gè)服務(wù)的時(shí)候,首先會(huì)創(chuàng)建Sbb的實(shí)體(sbbEntity)例如在序列圖上看到的EnventRouteImpl這個(gè)SLEE這個(gè)內(nèi)部的類(lèi)就是執(zhí)行這樣的動(dòng)作,在EnventRouteImpl中,首先實(shí)體暫時(shí)不和任何對(duì)象相互關(guān)聯(lián)的,幾個(gè)方法可以調(diào)用讓Sbb對(duì)象將從對(duì)象池進(jìn)入Ready狀態(tài),SbbCreate和SbbActivate,前者是在使用ChildRelation對(duì)象中的create的方法或者是事件產(chǎn)生的時(shí)候才被調(diào)用,后者是一個(gè)sbb對(duì)象需要調(diào)用一個(gè)現(xiàn)有的Sbb實(shí)體上的某個(gè)方法的時(shí)候才這樣做,這種情況往往是一個(gè)沒(méi)有Sbb對(duì)象對(duì)應(yīng)一個(gè)Sbb實(shí)體而進(jìn)入準(zhǔn)備狀態(tài)的時(shí)候。 對(duì)于一個(gè)處于Ready狀態(tài)的Sbb對(duì)象,它已經(jīng)和具體的某個(gè)Sbb實(shí)體相關(guān)聯(lián)了,這個(gè)時(shí)候Sbb對(duì)象可以和Sbb實(shí)體之間同步暫態(tài)和穩(wěn)態(tài)的數(shù)據(jù)了,例如一個(gè)數(shù)據(jù)庫(kù)之間的同步。需要調(diào)用 SbbLaod 方法和SbbStore 方法。SbbLaod方法用數(shù)據(jù)庫(kù)中的數(shù)據(jù)刷新變量的值,SbbStore方法把變量的值寫(xiě)入到數(shù)據(jù)庫(kù)中,和EJB的規(guī)范一樣,Sbb的開(kāi)發(fā)者,也就是客戶(hù)端是不能直接調(diào)用 SbbLoad 方法和SbbStore 方法。 涉及到具體的業(yè)務(wù)處理的方法,SLEE要在業(yè)務(wù)處理方法調(diào)用之前調(diào)用 SbbLoad 方法刷新數(shù)據(jù),業(yè)務(wù)處理方法執(zhí)行之后,SLEE 容器又立即調(diào)用 SbbStore 方法把數(shù)據(jù)存儲(chǔ)到數(shù)據(jù)庫(kù)中。,開(kāi)發(fā)人員在業(yè)務(wù)處理方法中不必刷新和存儲(chǔ)實(shí)例變量的值,如果有興趣瀏覽SLEE的源代碼,可以看到,在一個(gè)事件到來(lái)的階段,一旦一個(gè)Sbb實(shí)體和某個(gè)Sbb對(duì)象關(guān)聯(lián)以后,將調(diào)用SbbLoad,而調(diào)用刪除或者是Roll Back方法的時(shí)候,將調(diào)用SbbStore。 刪除對(duì)象的方法EJB的生命周期非常相似,這里就不介紹了。 8.SLEE 如何刪除 SBB 實(shí)體子目錄 SLEE用附屬點(diǎn)(attachment count)的機(jī)制來(lái)刪除SBB實(shí)體樹(shù),它不再附屬于任何一個(gè)行為實(shí)體,它將不再接收事件,也就被刪除了,這個(gè)機(jī)制也就是JAVA垃圾回收機(jī)制的一種擴(kuò)展。 9. Sbb 的持久穩(wěn)定狀態(tài): Sbb采用CMP域(CMP field)定義了它的穩(wěn)定狀態(tài),CMP將持久保存的管理交給SLEE,SLEE規(guī)范中定義的CMP的體系是基本上基于Java EJB2.0規(guī)范中,它們之間的不同可以參看規(guī)范的6.5章節(jié)。 10.服務(wù)的定義(service.xml): 在SLEE里被展開(kāi)的服務(wù)展開(kāi)描述定義一個(gè)展開(kāi)/管理的配置文件?梢詤⒖碢roxy中的service.xml 圖7. 本圖表示了一個(gè)外部資源如何將一個(gè)消息轉(zhuǎn)交給Sbb處理的過(guò)程,從圖中可以看到SLEE的端點(diǎn)獲得了事件以后傳遞到核心事件處理系統(tǒng)(Event Routing)中,然后轉(zhuǎn)交給事件處理的回調(diào)過(guò)程。 六.?dāng)?shù)據(jù)供應(yīng)(Provisioned Data)和Profile(數(shù)據(jù)簡(jiǎn)表) 圖8。數(shù)據(jù)供應(yīng)的基本組成,從圖上看SBB從Profile Table中得到各個(gè)Profile接口,而Profile從Profile Mbean服務(wù)器獲得具體的數(shù)據(jù)內(nèi)容,從Profile Management Client的角度上來(lái)看,來(lái)看是可讀寫(xiě)的,而從Sbb獲得配置的角度上看,是只讀的。 1.?dāng)?shù)據(jù)供應(yīng)(profile): 在SLEE中供應(yīng)數(shù)據(jù)表現(xiàn)為闡述數(shù)據(jù)模型的profile,數(shù)據(jù)模型將profile集群到profile表中(profile table),Profile中的接口給則定義了應(yīng)用程序調(diào)用的方式,一個(gè)Profile的規(guī)則包括了接口,類(lèi),和部署描述單元,用戶(hù)采用這個(gè)規(guī)則訪(fǎng)問(wèn)profile,獲得數(shù)據(jù)信息。 2.關(guān)于Profile規(guī)格的一些元素和各自的關(guān)系: 1> 從Sbb視角上看范例和執(zhí)行流程; 我們可以下載OpenCloud的Slee的參考設(shè)計(jì)<Call Forwarding Call Blocking>,描述SBB對(duì)profile的調(diào)用,在這個(gè)Profile中包含了地址簡(jiǎn)表和資源簡(jiǎn)表兩個(gè)對(duì)資源描述: a. 在創(chuàng)建SBB的過(guò)程中。sbbCreate中首先通過(guò)調(diào)用JNDI 的 lookup() 方法執(zhí)行查找,獲得簡(jiǎn)表接口的實(shí)例--簡(jiǎn)表的工具Profilefacility; b. 利用Profilefacility簡(jiǎn)表工具中的getProfileByIndexedAttribute方法,這個(gè)方法是Profile工具中定義的,只要應(yīng)用了Profilefacility接口就可以使用到這個(gè)方法獲得相應(yīng)的簡(jiǎn)表。 帶入的參數(shù)中第一個(gè)String profileTableName是一個(gè)Profile的表名,參數(shù)的第二個(gè)String attributeName是表中profile,例如在一個(gè)表中有address,mail,name這三個(gè)Profile,第三個(gè)參數(shù)就是attributeValue,也就是指具體的特性值,例如某個(gè)連接呼叫對(duì)應(yīng)的目的地址值。返回的就是PorfileID也就是每個(gè)Porfile的鑒別符。 c. 根據(jù)profileid調(diào)用getProfile從profile表中獲得profile,我們?cè)谏厦娼榻B過(guò)一個(gè)Profile通過(guò)兩個(gè)接口繼承,這兩個(gè)接口是AddressProfileCMP,和ResourceInfoProfileCMP,SLEE是從Resource Info Profile表的各個(gè)接口中獲得資源適配器實(shí)體的相關(guān)信息,地址簡(jiǎn)表在本例中的繼承擴(kuò)展了另外的一些接口,例如用于對(duì)呼叫前轉(zhuǎn)(Call Forwarding)的地址進(jìn)行設(shè)定或者提。ㄊ褂胹etForwardingAddress和getForwardingAddress的兩個(gè)方法來(lái)管理) d. 獲得了profile后就可以調(diào)用profile接口中定義好的方法來(lái)訪(fǎng)問(wèn)Profile資源了,例如設(shè)定或者獲得呼叫前轉(zhuǎn)地址。 2> 從管理視角上看Profile的管理過(guò)程: ProfileManagement;一個(gè)Profile的管理,對(duì)于一個(gè)管理客戶(hù)端來(lái)說(shuō),會(huì)有一個(gè)管理客戶(hù)端(Profile Management Client)的接口,這個(gè)接口可以被網(wǎng)絡(luò)管理代理所調(diào)用。通過(guò)這個(gè)接口可以設(shè)定或者是獲得Profile的特性,SLEE對(duì)Profile管理對(duì)象進(jìn)行實(shí)例化的時(shí)候,Profile管理對(duì)象將會(huì)緩沖,而且成為一個(gè)實(shí)時(shí)的運(yùn)行對(duì)象,通過(guò)Porfile CMP接口調(diào)用持久化域中的設(shè)定和獲得的方法(Set/Get)來(lái)執(zhí)行對(duì)Profile的訪(fǎng)問(wèn),這個(gè)和Sbb開(kāi)發(fā)者的使用是一致的。 3> ProfileMbean接口: Profile規(guī)范中規(guī)定了采用Profile中的ProfileManagementbean類(lèi)來(lái)提供管理者對(duì)Profile的訪(fǎng)問(wèn),更確切的說(shuō),外部的管理者調(diào)用ProfileMbean對(duì)象,ProfileMbean對(duì)象調(diào)用Profile緩沖的ProfileManagement對(duì)象,另外要注意的一點(diǎn)是Profile MBean類(lèi)可以應(yīng)用在任何JMX規(guī)范的MBean類(lèi)型上,但是必須要在Mbean服務(wù)器上已經(jīng)注冊(cè)的接口才可以(也就是用CreateProfile創(chuàng)建的Mbean,這里可以把Profile Mbaen理解為JMX Mbean接口的應(yīng)用) ProfileMbean的接口可以參看規(guī)范156頁(yè)的介紹; 七. 服務(wù)和部署(Service and Deployment) 總結(jié)上面所述我們總結(jié)一下基本的服務(wù)的部署模式: 和EJB類(lèi)似,SBB的部署過(guò)程是基本相同的,只是服務(wù)性質(zhì)服務(wù)描述上不一致,部署描述可以參看EJB的onMessage EJB的部署,部署者這個(gè)角色范例在SLEE的部署中同樣有定義,開(kāi)發(fā)者必須實(shí)現(xiàn)所有接口的抽象實(shí)例,一般這些實(shí)例包括: a. 生命周期內(nèi)的各個(gè)回調(diào)方法; b. 事件(包含某些SLEE內(nèi)部工具產(chǎn)生的事件,例如TIMER)處理句柄的方法; c. 發(fā)送消息,和獲得profile的一些抽象方法等等; d. 獲得子SBB的方法; e. 訪(fǎng)問(wèn)Sbb中CMP域的一些方法; f. 可共享的數(shù)據(jù),例如行為實(shí)體等; 在部署服務(wù)期間所要定義的的XML文件和發(fā)布方法。 1> META-INF/sbb-jar.xml:sbb的jar文件,包含了: SBB描述符表示的是SBB的接口,類(lèi)以及子類(lèi)的關(guān)系,Activity Context的描述, 2> META-INF/event-jar.xml:Mobicents所感興趣的消息,這里主要是SIP消息。 SBB開(kāi)發(fā)者對(duì)事件的描述部分,我們?cè)谇懊嬉呀?jīng)看到了很多介紹,在部署階段,描述事件類(lèi)型的Java類(lèi)文件就是用該文件來(lái)進(jìn)行。 3> META-INF/slee-profile-spec-jar.xml:用于對(duì)profile的類(lèi)型進(jìn)行定義。 在SLEE規(guī)范中定義,Profile的jar文件可以包裝一個(gè)或者多個(gè)Profile規(guī)范。 4> service.xml:定義服務(wù)。服務(wù)描述文件是表示所部署的SBB服務(wù)的文件。 5> 部署文件: deployable-unit.xml:用于對(duì)jar執(zhí)行文件進(jìn)行部署,定義事件和定義服務(wù),SBB,資源和profile將裝入SLEE。 6> resource-adaptor-type-jar.xml:用于對(duì)資源適配器類(lèi)型部署的描述。 7> 使用SleeCommandInterface來(lái)完成組件的部署任務(wù): 對(duì)于部署和應(yīng)用在Mobicents中,使用了SleeCommandInterface工具,JBOSS主要是使用JMX框架的,各個(gè)組件之間采用JMX進(jìn)行通訊,各個(gè)服務(wù)組件(Mbean)都以插件的方式掛接在MBean服務(wù)器上,SleeCommandInterface工具中使用了jmx/rmi/RMIAdaptor的Mbean作為服務(wù)接口,在下面我們將以創(chuàng)建實(shí)體類(lèi)的方法來(lái)介紹一下掛接資源適配器的過(guò)程,其他的服務(wù)部署和這個(gè)也是類(lèi)似的。 本質(zhì)上SLeeCommandInterface是一個(gè)用于對(duì)JAIN SLEE容器在命令行下的部署,啟動(dòng)服務(wù),創(chuàng)建資源適配器的任務(wù).通常而言,要啟動(dòng)SLEE容器,要部署和啟動(dòng)資源適配器,然后是部署和啟動(dòng)SLEE,關(guān)于"SLEE命令"大家可以參看源代碼。 啟動(dòng)資源適配器是由DeploySipRA.sh來(lái)進(jìn)行,而在范例中啟動(dòng)網(wǎng)關(guān)是由DeploySipProxy.sh來(lái)完成. 部署一個(gè)SIP資源適配器首先要部署(-deploy)兩個(gè)JAR文件,一個(gè)是 sip-ra-type.jar另外一個(gè)是sip-local-ra.jar,在創(chuàng)建SIP資源適配器時(shí)候,在Mobicents的根目錄下運(yùn)行ant siptype和ant sipra就可以生成他們,前者包含了SIP事件和Activity的一些定義側(cè)重于資源,的后者包含了協(xié)議本身的實(shí)現(xiàn) 。 下一步是-createRaEntity,也就是創(chuàng)建SIP的資源適配器, resource-adaptor-jar.xml中定義了資源配置器的jar文件,和resource-adaptor-type-jar.xml不同的地方在于,前者是直接面向特定某個(gè)資源配置器的類(lèi)文件,例如這里指明了。 org.mobicents.slee.resource.sip.SipResourceAdaptor 告訴了SLEE資源配置器的調(diào)用入口的類(lèi),也就是SIP協(xié)議的封裝,那么給誰(shuí)調(diào)用呢,回到前面說(shuō)的createRaEntity創(chuàng)建實(shí)體命令來(lái),上面說(shuō)了通過(guò)JMX的框架來(lái)完成調(diào)用創(chuàng)建的過(guò)程,首先在初始化SleeCommandInterface的過(guò)程當(dāng)中,RemoteMbeanServer已經(jīng)被定義為jmx/rmi/RMIAdaptor,而JNDI中的URL是SBB開(kāi)發(fā)者定義的,在Mobicents中對(duì)資源適配器進(jìn)行管理的是ResourceAdaptorMBean接口,而它的Mobicents中的實(shí)例化ResourceAdaptorMBeanImpl繼承了JBOSS中的StandardMBean.這個(gè)接口提供了createResourceAdaptorEntity方法來(lái)創(chuàng)建資源適配器的實(shí)體,這個(gè)接口的實(shí)例化的過(guò)程帶入的參數(shù)是當(dāng)前在resource-adaptor-jar.xml中指定的SIP協(xié)議的封裝,并且使用createResourceAdaptorEntity來(lái)創(chuàng)建實(shí)體SIPRA,實(shí)體在SLEE中是以ResourceAdaptorEntity類(lèi)來(lái)表示的,其部署文件中會(huì)調(diào)用該類(lèi)的方法來(lái)完成進(jìn)一步的實(shí)施. 最后一步,就是要使用(激活)實(shí)體SIPRA了,使用命令-activateRaEntity來(lái)進(jìn)行,和上面的創(chuàng)建實(shí)體的過(guò)程一樣,同樣是利用ResourceAdaptorMBean接口的來(lái)完成的,而方法則是使用了activateResourceAdaptorEntity方法來(lái)激活,經(jīng)過(guò)一系列的方法的封裝之后,最后會(huì)調(diào)用SipResourceAdaptor的start方法,創(chuàng)建偵聽(tīng)者,消息工廠(chǎng),地址工廠(chǎng)的實(shí)例。 八.應(yīng)用范例(SIP代理服務(wù)器,信令網(wǎng)關(guān)) 我們下面以SIP代理服務(wù)器(JainSipProxy)為例子來(lái)闡述一個(gè)基本SIP應(yīng)用建立的過(guò)程: 事件接收: 1. 首先是SLEE接收到一個(gè)SIP消息. 2. 這個(gè)事件是一個(gè)初始化事件--intial-event 3.如果initial-event-select-variable中規(guī)定的事件是 ActivityContext,表示初始化事件帶入的參數(shù), 4. 當(dāng)資源適配器發(fā)送一個(gè)消息到一個(gè)新的活躍實(shí)體上下文后,一個(gè)對(duì)應(yīng)的服務(wù)將會(huì)初始化,Event Router可能也會(huì)創(chuàng)建一個(gè)新的子Sbb來(lái)進(jìn)行處理。 5. 一個(gè)活躍實(shí)體上下文將會(huì)以一對(duì)一的方式對(duì)應(yīng)一個(gè)事件,也就是Activity。 6. SIP的資源適配器將會(huì)把這個(gè)活躍實(shí)體定義為一個(gè)專(zhuān)門(mén)的SIP狀態(tài)機(jī)(SIP Transaction)當(dāng)中網(wǎng)關(guān)維持的SIP會(huì)話(huà)狀態(tài)。 服務(wù)邏輯 JAIN SIP協(xié)議棧將會(huì)接收SIP消息,事件接收到以后,通過(guò)消息處理器發(fā)送到SLEE的事件引導(dǎo)部分EnventRouteImpl進(jìn)行,這個(gè)時(shí)候,Sbb對(duì)象將要進(jìn)入Ready狀態(tài)了,調(diào)用SbbCreate回調(diào)將被調(diào)用。 對(duì)于初始化的事件來(lái)說(shuō),initial-event-select表示第一個(gè)事件觸發(fā)時(shí)候?qū)⒁尤氲膮?shù),我們來(lái)看這個(gè)參數(shù)在這里是Activity Context,也即是JAIN SIP事件發(fā)送到上面去的上下文,這個(gè)時(shí)候通過(guò)EnventRouteImpl選舉到convergence names,你可以理解它為一個(gè)事件的回調(diào)句柄,也就是事件的消費(fèi)者,在SBB事件處理回調(diào)會(huì)調(diào)用這個(gè)句柄,并且把ActivityContext作為參數(shù)帶入。 例如這個(gè)時(shí)候事件INVITE使用onInviteEvent消息處理句柄,這個(gè)是有狀態(tài)的服務(wù),需要代理維持狀態(tài),例如INVITE消息以及后續(xù)的Trying,Ringing,OK等消息,無(wú)狀態(tài)的如ACK消息,有狀態(tài)的消息,意味著要?jiǎng)?chuàng)建一個(gè)狀態(tài)機(jī)維持后續(xù)消息的狀態(tài),也就是ClientTransction和ServerTransction。這兩個(gè)狀態(tài)機(jī)都是維持會(huì)話(huà)的,而無(wú)狀態(tài)呼叫,可以消息序列的最后一個(gè)消息。
移動(dòng)通信網(wǎng) | 通信人才網(wǎng) | 更新日志 | 團(tuán)隊(duì)博客 | 免責(zé)聲明 | 關(guān)于詞典 | 幫助