Jacorb中的poa实现之系列一(by huihoo.com java_farmer , Allen 补充、整理) Jacorb中的poa实现之系列一 1.RequestController.java(该类的实例以下称为请求控制线程) 功能描述:从请求队列中取出请求对象,对其采取必要的处理步骤。 主要接口描述: WaitForQueue():在以下三种情况下阻塞请求控制线程:(1)请求队列为空;(2)poa状态为holding;(3)准备关闭poa。 ContinueToWork():和WaitForQueue()相反,唤醒阻塞的请求控制线程。 WaitForCompletion():由外部线程调用,调用这个方法的线程在对应的请求控制线程上阻塞直至活跃请求表中为空,同时请求控制线程不再接受新的请求。这个方法用在POA.java中,当POA的状态改变到holding,inactive,discarding并且输入参数中waitforcompletion值为true时,会调用该POA上的请求控制对象的本方法。 resetPreviousCompletionCall():由外部线程调用,和WaitForCompletion()相反,唤醒阻塞在对应的请求控制线程上的所有线程。 WaitForObjectCompletion():与前面的WaitForCompletion()方法类似,调用这个方法的线程在对应的请求控制线程上阻塞直至活跃请求表中不再包含对特定id对应的corba对象的请求。这个方法将被AOM.java中的remove()方法使用,确保在活动对象映射表中删除一个corba对象以前所有对该corba对象的活跃请求都应被执行完毕。 WaitForShutdown():由外部线程调用,调用这个方法的线程在对应的请求控制线程上阻塞直至活跃请求表中为空,同时请求控制线程不再接受新的请求,这个方法在关闭POA时被使用。 queueRequest():将请求加入请求队列,调用了RequestQueue类中的方法。 ProcessRequest():派遣请求对象到请求处理线程,如果请求处理线程池中线程数到达最大值,方法阻塞直至获得请求处理线程。 ??为何该函数的声明中只抛出了两种异常?? run():线程运行主程序,根据POA的状态以及ProcessRequest()抛出的异常判断执行的任务。 2.RequestProcessor.java(该类的实例以下称为请求处理线程) 功能描述:处理每个请求对象的实际请求操作 ??静态哈希表specialOperation中包含的东西指的是什么?? 主要接口描述: invokeIncarnate():使AOM(活动对象映射)执行incarnate调用。 invokeOperation():调用servant上的相应方法。 invokePostInvoke():调用servant locator上的PostInvoke()。 invokePreInvoke():调用servant locator上的PreInvoke()。 process():处理请求的实际过程。 run():线程运行主程序,处理完请求后将线程返回给请求处理线程池(在RPPoolManager.java中实现),然后阻塞直至有请求发送过来。 3.RequestQueue.java(该类的实例以下称为请求队列)。 功能描述:保存一系列请求,主要是作为RequestControllor类的辅助类。 主要接口描述: add():被RequestController.java中的queueRequest()调用,如果队列满则抛出ResourceLimitReachedException。如果加入请求前队列为空,激活在本请求队列上阻塞的请求控制线程。 getElementAndRemove():返回特定的一个ServerRequest对象并从队列中删除该对象,如果满足条件的ServerRequest对象不存在返回NULL。 4.RPPoolManager.java(该类的实例以下称为请求处理线程池)。 功能描述:使用线程池技术保存并重复使用一系列的RequestProcessor对象。 主要接口描述: getProcessor():返回线程池中的一个请求处理线程,如果线程池中没有空闲线程并且正在处理请求的线程数达到最大值,调用这个方法的线程阻塞直至有一个处理完请求的线程返回,如果正在处理请求的线程数未达到最大值,创建一个新的请求处理线程并返回该对象。 init():初始化请求处理线程池,初始化时创建的请求处理线程个数为线程池的最小值。 releaseProcessor():如果池中的线程数未达到最小值将请求处理线程返回到线程池并激活在请求处理线程池对象上阻塞的线程;否则销毁这个请求处理线程。 destroy():销毁所有在池中的空闲请求处理线程对象。 setPoolSize():重置池中线程数的最小值和最大值。 5.AOM.java(该类的实例以下称为活动对象映射对象)。 功能描述:将corba对象映射到servant对象。 主要接口描述: add():传入的参数为一个id,servant对,如果该id是正在被incarnate(具体化)或者etherealize(气化)的corba对象的id则阻赛直到incarnate()或者etherealize()结束,否则将id,servant对加入到映射表。 getObjectId():返回对应特定servant对象的corba对象的id。 getServant():返回对应到特定的corba对象id的servant对象,如果POA策略不是UNIQUE_ID,抛出内部错误。 incarnate():为了保证序列化incarnate和etherealize过程以及incarnate和etherealize过程的互斥,如果有incarnate或者etherealize过程正在进行,阻塞直至那些过程结束。如果映射表中包含了对应id的corba对象,直接返回该id对应的servant,否则调用servant activator对象的incarnate()方法创建一个servant对象并随后激活那些阻塞的incarnate或者etherealize过程。最后如果创建得到的servant不为NULL,则将对应的id,servant对加入到映射表。 remove():从活动对象映射表中删除特定的一个corba对象,并随后执行对应servant的etherealize过程。 6.POAManager(该类的实例以下称为poa管理器) 功能描述:主要是负责一系列poa的状态管理。 主要接口描述: activate():将与该POA管理器关联的所有POA的状态改变成ACTIVE,实现正如规范中描述的功能。 deactivate() discard_requests() hold_request():这三个函数分别实现规范中描述的POA状态的三种改变。函数输入参数中的waitForCompletion为true时,这三个函数都是用了thread.join()以确保函数在所有的POA完成了已有的活动请求后返回。 isInInvocationContext():判断当前线程是否处于由与本POA管理器属于同一个ORB的其他POA派遣的调用上下文。 7.POA(该类的实例以下称为可移植对象适配器) _getChildPOA():从POA中找到一个符合特定名称的子POA。当adapter Activator为空或者POA处于holding,discarding,inactive状态,抛出特定的异常。如果POA使用SingleThreadModel策略,必须将所有对adapter Activator的请求序列化(实现中使用了一个同步变量)。 _getQualifiedName():返回该POA相对RootPOA的相对路径。 _invoke():该方法将被orb调用以处理单个请求。 未完待续... 创建和使用POA: 1、Define the POA policies(规则). 2、Create a POA. 3、Activate the POA through its POA manager. 4、Create and activate servants(仆从程序). 5、Create and use servant managers. 6、Use adapter activators(激活器). POA结构图 poa service manager |