之所以叫, 主动对象, 区别于被动对象, 只能被动被别人调用的对象, 而主动对象内部有线程可以自行调用自己的方法.
Active Object是一种高级模式, 概念上和RPC有些类似, 但是实现和用途不一样
Active Object首先使用了Proxy模式, 这个和RPC一样, 用户可以象访问local function一样使用
然后Active Object关键的一步是使用command模式分离invacation和execution, proxy并没有直接运行调用逻辑, 而是封装成command发送给invoker queue
Active Object主要用于异步并发, 而RPC主要用于web service
The Active Object Design pattern decouples method execution from method invocation, which reside in their own threads of control.
The goal is to introduce concurrency and fault tolerance, by using asynchronous method invocation and a scheduler for handling requests.
Active Object 设计模式的本质是解耦合方法的调用 (Method invocation) 与方法的执行 (Method execution), 方法调用发生在调用者线程, 而方法的执行发生在独立于调用者线程的Active Object线程, 并且这个过程对用户透明.
在 Active Object 模式中,主要有以下几种类型的参与者:
- 代理 (Proxy) :代理是Active Object所定义的对于调用者的公共接口. 运行时代理运行在调用者线程的上下文中, 负责把调用者的方法调用转换成相应的方法请求(Method Request), 并将其插入相应的Activation Queue, 最后返回给调用者Future对象
- 方法请求(Command):方法请求定义了方法执行所需要的上下文信息, 诸如调用参数等
- Activation Queue:负责存储所有由代理创建的, 等待执行的方法请求. 从运行时来看, Activation Queue会被包括调用者线程及其Active Object线程并发存取访问, 所以Activation Queue实现应当是线程安全的
- 调度者(Scheduler):调度者运行在Active Object线程中, 调度者来决定下一个执行的方法请求, 而调度策略可以基于很多种标准, 比如根据方法请求被插入的顺序FIFO或者LIFO, 比如根据方法请求的优先级等等
- Implementer: Implementer是Proxy所定义的接口的事实实现
- Future: 调用者调用Proxy所定义的方法, 获得Future对象. 调用者可以从该Future对象获得方法执行的最终结果. 在真实的实现里, Future对象会保留一个私有的空间, 用来存放Implementer方法执行的结果
可以通过以下的方式从Future对象获得真实的执行结果Message:
- 同步等待: 调用者调用Future对象的result()方法同步等待, 直到后端的Implementer相应方法执行结束, 并把结果存储到了Future对象中来, result返回, 调用者获得Message
- 同步超时等待: 调用者调用Future对象的result(timeout)方法. 如果过了timeout时间之后, 后端的Implementer相应方法执行仍未结束, 则调用失败, 否则, 调用者线程被唤醒, result方法返回, 调用者获得Message
- 异步查询: 调用者可以通过调用Future对象定义的查询方法, 查看真实的结果是否准备好了, 如果准备好了, 调用result方法, 直接获得Message