[Agent]Agent编程平台的实现,你会晕吗?

该平台于2005年基于DOTNET V1.1实现,版本号V1.0,本文描述一下实现的方案。目前,我正在升级V2.0,该版本Agent将完全兼容OOP,采用面向上下文编程方法实现。这 玩意比较抽象,估计你会晕,如果有晕的地方,就多看几遍,我一开始自己都被自己搞糊涂了。底层应用的技术有 DynamicProxy,ObjectBuilder,Agent技术和面向上下文编程模型。
Object和Agent
什么是Agent?为社么需要Agent?Agent属于人工智能的范畴,它也被称为“代理人”。Agent能够在一定程序上模拟了人类社会的行为和关系,具有一定的智能并能够自主运行。通俗的将,Agent相当于“人”。先用一个场景来看一下为什么需要Agent。
场景为“人物A让人物B关门”,Object模拟:用对象A模拟人物A,对象B模拟人物B,对象B具有关门的方法。在对象A中调用“B.关门()”方法对该场景进行模拟。
该模拟的缺陷如下:
缺陷一:对象是静态的,并不能贴切模拟人的思维等。
缺陷二:“对象A中调用‘B.关门()’方法”模拟该场景时,实际上是对象A的线程执行“B.关门()”方法的代码(与人类活动相左),而现实中是B来执行的。
缺陷三:在该模拟中,对象A调用“B.关门()”方法后,它必须等待该方法执行完毕后才能执行其它操作,这与现实是不一致的(需要异步支持)。
Object用于模拟只能实体,天生就有一些缺陷,相比Agent,它是静态的、被动的和没有思维的。本文针对利用Object模拟现实的缺陷,提出了改进的方案——将Object包装成Agent,使Object具有Agent的特性,方案如下。
缺陷一改进:将消息队列和消息处理器(作用相当于大脑)与Object绑定,使得对象能够模拟人的思维来接收消息并处理。这个消息处理器是一个线程。
缺陷二改进:设计一个调用拦截体系。当一个对象调用另一个对象的方法时,拦截体系能够拦截当前调用,并将该调用封装成一个消息包,发送给目标对象。目标对象的消息处理器从消息队列中获取该消息并处理。
缺陷三改进:拦截体系拦截调用后会根据调用方法的性质(同步或者异步)决定调用线程是否要等待调用结果或直接返回。
本 文把基于拦截体系的OOP平台称为AOP平台。该平台把基于拦截体系改进后的Object称为Agent。在该平台,Agent的本质是基于拦截体系的与 消息队列和消息处理器绑定的对象。上述的Agent能够模拟人与人之间的合作,但是在现实社会,不仅有单个人之间的合作,还存在团队合作。因此,本文提出 了一个Agent组(AgentGroup)概念。利用AgentGroup来模拟一个团队,一个AgentGroup由多个Agent组成。 AgentGroup的本质是与消息队列、消息处理器和消息路由器绑定的Object,并且由一个或几个Agent组成。
Agent和AgentGroup结构

在 本平台,Agent本质上是基于拦截体系的与消息队列和消息处理器绑定的对象。一个Agent至少包含一个消息队列和一个消息处理器。 AgentGroup的本质是与消息队列、消息处理器和消息路由器绑定的Object。一个AgentGroup至少包含一个消息队列、一个消息处理器、 一个消息路由器以及所包含的Agent。AgentGroup的消息队列用来接收、保存和读取与该AgentGroup相关的消息。当系统给一个 Agent发送消息时,如果该Agent属于一个AgentGroup,则这个消息会发送给该Agent所属的组。AgentGroup消息处理器本质也 是一个线程,它的状态图与Agent不同的是它没有“等待调用结果”状态和与该状态相关的转换。AgentGroup消息处理器主要是用来循环的从消息队 列读取消息,然后将该消息发送给消息路由器。消息路由器的作用是将该消息根据某种路由方式路由给该AgentGroup的一个或几个Agent。
拦截体系的实现
该 改进方案的实现依赖于一个拦截体系。拦截体系由3部分组成:(1)目标对象。(2)拦截机对象。(3)目标对象代理。拦截体系的工作机制如下:(1)利 用动态代理技术建立目标对象的代理,该代理暴露了与目标对象相同的接口;(2)调用对象调用目标对象的代理的接口时,拦截体系首先将当前调用封装成调用消 息包,然后建立一个相应拦截机对象,将当前消息作为参数传递给拦截机对象的Invoke方法,由拦截机对象决定如何调用目标对象的方法。

用 户注册一个Agent时,本平台首先创建该Agent的代理对象以及相应的拦截机对象。用户要调用一个Agent方法时,它首先从本平台获取需要调用的 Agent,本平台将会返回该Agent相应的动态代理对象给用户,此时,用户并非获取了Agent,而是Agent的代理对象;当用户调用代理对象的方 法时,拦截体系会从堆栈中取出当前调用信息,并将当前调用转换成一个调用消息包,传递给拦截机对象,拦截机对象会根据当前调用消息包的信息路由给被调用的 Agent或者被调用Agent所在的AgentGroup。因此,要实现一个拦截体系,必须实现:动态代理技术和拦截机。
动态代理技术 可以利用当前流行的OOP平台现成的反射机制和代码生成来完成,它的实现过程如下:(1)利用反射机制获取目标对象的描述信息,这些描述信息包括目标对象 的所有成员和方法的信息;(2)利用代码生成,动态的构建与目标对象的所有成员和方法信息一致的代理对象,并插入相应的拦截机对象。拦截机的作用是在将拦 截体系发送的调用消息包进行处理和路由。拦截机将根据不同的调用方式进行不同的处理。
基于拦截体系的AOP平台,Agent与 Agent、Agent与AgentGroup的调用将不同于Object间的调用。在AOP平台中,因为有了拦截体系,调用者的线程不再进入被调用者的 方法,而是转到拦截机,执行拦截机代码然后等待结果或者返回。该平台允许Agent、AgentGroup间共4种不同的调用方式:Agent与 Agent的同步调用、Agent与Agent的异步调用、Agent与AgentGroup的同步调用和Agent与AgentGroup的异步调用。

赞(0) 打赏
分享到: 更多 (0)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏