整个生命周期的过程
从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



















