整個生命周期的過程
從pooled狀态到ready狀态
SBB對象的生命周期開始于SLEE用newInstance()方法創建一個SBB對象,然後SLEE調用setSbbContext()方法給SBB對象設置一個sbbContext對象,這是該SBB對象就能調用SLEE提供的方法了,并進入到了pooled狀态。
進入pooled狀态的SBB對象都一個自己的pool空間,但他們沒有和任何的SBB實體相關聯,這時pool池中的所有SBB對象都一樣,SBB實體要想進入Ready狀态,需要給SBB對象分配一個SBB實體。
從pooled狀态到ready狀态有兩種實現方式:
第一種:調用SbbCreate()方法或者SbbPostCreat()方法。(SLEE需要創建一個新的SBBEntity時調用SbbPostCreat()方法,當SLEE需要為已經存在的SbbEntity分配一個SBB對象時調用SbbCreate()方法)。
第二種:調用SbbActivity()方法。SLEE需要為已經存在的SbbEntity分配一個SBB對象
回到pooled狀态
在Ready狀态下:SBB對象已經和SBB實體建立了關聯關系,SBB通過調用sbbLoad()方法和sbbStore()方法若幹次,實現SBB對象的瞬時狀态與SBB實體的持久狀态的同步。這時SBB對象就能夠進行接收事件和進行事件的處理。當SBB對象處理完事件後還要回到pooled狀态,這一過程有三種可能的途徑來實現:
第一種:調用sbbPassivate()方法。回收分配給SBB Entity的Sbb對象。
第二種:調用sbbRemove()方法。移除SBB實體。
第三種:調用sbbCreate()方法或sbbPostCreate()方法成功,且沒有抛出異常,但是最終食物回滾了。
當SBB返回到pooled狀态後,SLEE可以通過調用unSetSbbContext()方法,使SBB對象成為垃圾而被回收。
SBB實體樹和SBB圖
SBB圖和SBB樹都是用來表現SBB間的關系圖,區别在于SBB圖用來表示SBB對象間的關系圖,在圖1中,節點表示SBB對象,邊表示SBB對象間的關系,邊上的數表示事件傳遞優先級。
SBB樹是一個定向不循環圖,用來表示SBB實體間的關系圖,在圖2中,節點表示SBB實體,邊表示SBB實體間的關系,邊上的數表示事件傳遞優先級。一般來說事件傳遞的優先級是由父級SBB來指定,在運行中,這種優先級别可以改變。每個父SBB可以有多個子SBB,但一個子SBB隻能有一個父SBB
下圖為一個SBB實體樹的實例圖:
SBB的優先級
SBB的優先級決定着同根子SBB實體接收事件的順序。
SBB事件發送的優先級範圍是(-128~127),最低是-128,最高是127.
指定同一個父SBB實體的子SBB實體的事件發送優先級有兩種方法:
1.産生該子SBB實體時産生的默認事件優先級。
2.在運行的過程中,父SBB實體可以通過調用setSbbPriority()方法給該實體的子實體修改事件發送優先級
事件發送的優先級可分為五個等級:
第一等級:最高級(100~~127)
第二等級:次高級(31~~99)
第三等級:标準級(-30~~30)
第四等級:次低級(-99~~-31)
第五等級:最低級(-128~~-100)
同一個父SBB實體的同胞SBB實體接收事件的順序按照優先級的從高到低的順序一次排列。
移除SBB實體樹
SBB實體:是SBB組件的一個實例,他是一個邏輯實體,是一個代表着實例持久性狀态的實體。
Attachment count ----與一個SBB實體相關聯的所有Activity Context的個數(包括該SBB實體的子SBB實體相關聯的Activity Context的個數)。
Remove一個SBB實體樹,就是通過将Attachment count的數量減到0來實現的。
移除一個SBB實體樹,需以下三步:
第一步:結束Avtivity Object。
第二步:解除所有的SBB實體與所綁定的ActivityContext的綁定關系。解除的順序是先解除子SBB實體在解除根SBB實體。解除完全的标志就是Attachment Count的數量減到0。
第三步:SLEE回收Activity Context,并級聯移除各個根SBB實體。
舉例說明
【說明】以上圖中,橢圓表示實體,矩形表示Activity Context,橢圓和矩形之間的無向線段表示實體與Activity Context之間有綁定關系,一對橢圓和矩形之間隻有一條無向線段,箭頭表示的是一種Child Relation關系,箭頭所指的實體為子實體,背離箭頭的為父實體。圖中的橢圓裡的數字就表示Attachments Count
【解釋1】Attachments Count
X1的Attachment Count(6個)=與x1綁定的AC:AC1和AC2(2個)+與Y1綁定的AC的個數(0個)+與Z1綁定的AC:AC2和AC3(2個)+與Y2綁定的AC:AC3和AC1(2個)
Y2的Attatchment Count(2個)=與y2綁定的AC;Ac1個AC3(2個)
【注:】Y2,沒有子SBB實體,所以他的Attchment就是它自己所綁定的Activity Context的個數。
【解釋2】SLEE回收SBB實體樹的過程
首先,在Activity Object已經終止的前提下,将Y2與AC1和AC3斷開綁定,使y2的Attchmentcount減到0,再斷開Z1與AC2和AC3的綁定斷開,使Z1的Attchmentcount減到0,最後将X1與AC2和AC1的綁定斷開,使X1的Attchmentcount減到0,
然後,SLEE回收Activity Context,并删除SBB實體。
SBB Local Interface 和sbb Local Object
每一個SBB都有一個SBB Local interface ,zhege SBB Local interface有兩種可能:一種是一個特殊的interface,這個特殊的interface是由SBB開發商提供的,并繼承了SBBLocalObject interface。
第二種是如果SBB開發商沒有提供特殊的Local Interface那麼它就是SbbLocalObject interface,一個SBB對象通過SBB Local Object同步的調用,分配有SBB實體的SBB對象,這個Sbb Local Object是有由SLEE實現的一個對象,SBB Local Object實現了sbb Local interface并描述了目标SBB實體,當SBB對象調用了SBB開發商在SBB Local object定義的方法時SBB抽象類中的相應的法會調用,調用這個相應方法的是描述這個SBB實體狀态的SBB對象,另一方面,sbb Local object是一個具有同步方法的客戶端對象。
理論上,一個SBB Local Object僅僅描述一個SBB實體,但是若幹個SBB Local Object也可能描述一個SBB實體。
一個SBB對象僅僅允許被一個SBB Local Object調用,這個SBB Local Object僅描述一個SBB實體樹中的實體,SBBLocal Object描述不同的sbb實體樹中的實體時,sbb對象調用sbb Local Object的行為并沒有定義。
SBB Local Interface
因為表現呼叫者的SBB對象和表現被呼叫者的SBB對象都必須被配置到同一個JVM中,所以這個接口被稱之為SBB Local Interface.在這個SBB Local Interface中生明了一些SBB對象的方法,這些SBB對象的方法可以被同步的調用。
獲得一個SBB Local Object的方法:
一個SBB Local Object是SLEE的一個實現類,這個實現類實現類SBB Local Interface。一個SBB對象可以通過一下方法來獲得一個描述SBB實體的SBB Local object :
1.調用childRelation對象的creat()方法。
2.調用sbbContext對象的getSbbLocalObject()方法。
3.通過調用sbb Local Object對象的一個方法來獲得一個Sbb Local Object ,被呼叫者可能通過它的一個輸入參數來獲得一個SBB Local Object ,呼叫者可能通過返回值來接收一個SBB Local object 。
4.從CMP field中找回一個已存在的SBB Local object
5.接收一個childRelation對象,這個childRelation對象實現了java。Util。Collection接口,這個ChildRelation對象和它的iterator對象可以訪問sbb local object。
SBB Local object 具有一下功能:
1.測試兩個SBB Local Object是否描述了同一個SBB實體
2.移除SBB Local Object描述的SBB實體及其他的SBB實體派生出來的SBB實體.
3.設置和獲取sbb Local Object描述的SBB實體發出事件的優先級.
4.調用sbb開發商定義的sbb Local Object的方法.
5.将sbb Local Object存儲到CMP中.
SBB Local Object interface
這個接口是所有SBB Local interface的父接口,所有的SBB Local Interface都繼承了這個sbbLocalObject接口,如果一個對象沒有定義一個特殊的sbb Local interface,那麼他的local Interface就是SBBLocalObject
sbbContext object
SBB上下文對象是SLEE給SBB對象的一些數據,SLEE将SBB上下文對象傳遞給SBB對象後,SBB對象便由不存在狀态進入了緩沖池狀态,這樣SBB便可以訪問SLEE和SBB實體提供的一些數據信息。SBB上下文對象實現了SBB上下文接口,該接口裡定義了一些得到業務信息,行為上下文,不可訪問事件,事務的方法。
SbbContext interface
SLEE為每一個SBB對象都提供了一個SbbContext對象,SLEE也維持SbbContext提供給sbb對象訪問sbb對象上下文的一個通道。也允許sbb對象調用SLEE提供的方法,并獲取分配給SBB
對象的SBB實體的信息,SBBContext對象實現類SBBContext接口,
SLEECMP和EJBCMP
CMP(Container Managed Persistence持久性容器管理),SLEE中的CMP是以EJB的CMP為基礎定義的,但有其不同之處:
1。SLEE會自動創建和删除SBB實體,而EJB則是通過程序代碼來執行。SBB實體并沒有一個外在的主鍵。
2。EJB中的CMP被用于把數據存入數據庫或者後台程序。SLEE的CMP用于識别哪些數據是應該被容器管理的,可以提供多種存取數據的方式。
3。EJB中有CMR(容器管理關系),SLEE中沒有。
SBB組件環境
SBB組件環境是一種機制,他有如下特征:
1。訪問SLEE工具
2。使用SLEE的規範部署文件來部署個性化的SBB組件
SBB開發者的職責:
進入SBB組件環境,通過使用JNDI接口,創建一個InitialContext對象(不帶參數),然後用該對象調用lookup(java:comp/env)方法進入SBB組件環境。
業務部署者的職責:
确保SBB組件的外界入口都有效,可以對外界入口的值進行修改
8.sbb指令
sbb是帶借位減法指令,它利用了CF位上記錄的借位值。
指令格式:sbb操作對象1,操作對象2
功能:操作對象1=操作對象1-操作對象2-CF
若AX=1020H,BX=1200H,CF=1,則SBB AX,BX的執行後AX的結果為:
1020-1200-1
=FE1F



















