JADE笔记

JADE(Java Agent Development Framework)是一个软件开发框架,它可以为智能AGENT开发多AGENT系统和遵守FIAP协议的应用程序。

FIPA是1996年建立的,作为一个国际性非营利组织,它主要负责制定和软件Agent技术相关的一系列标准。FIPA标准提出的核心观念是Agent通信、Agent管理和Agent体系结构。这里简单介绍,之后用到在具体说明。
1)Agent通信。Agent之间是使用Agent通信语言(ACL)进行交互的。FIPA-ACL是基于言语行为理论的,强调消息代表了一种行为或者说通信行为,同时,根据消息的目的、表达方式等不同,定义消息行为有通知、请求、同意、拒绝等,其涵盖了基本通信中最常用的行为方式。
2)Agent管理。Agent管理框架中,兼容FIPA的Agent是可以存在、进行操作和有效管理的,其为Agent的创建、注册、定位、通信、迁移和操作建立了逻辑参考模型。
3)抽象体系结构。抽象体系结构允许建立具体实现,同时提供它们之间的互操作机制,包括传输和解码的网关转换。这种结构详细定义了ACL消息结构、消息传输、Agent目录服务,并将目录服务指定为强制性的服务。
FIPA定义的一个agent平台的标准模型,如下图所示:

AMS是管理控制进出和使用AP的agent。一个平台上只能有一个AMS。它提供百页和生命周期服务,维护AID目录和agent状态。为了获得有效的AID,每个agent都必须在AMS上注册。

DF是平台上提供默认黄页服务的agent。

消息传输系统也叫agent通信通道(ACC),由软件构成在平台内负责所有的消息交换,包括来自或发送到远程平台的消息。

JADE完全遵守这个参考架构,当一个JADE平台被启动,AMS和DF立刻被创建,ACC模块也设置为允许消息通信。Agent平台可以分布在不同的主机上。但一台主机上只能有一个应用程序即一个JAVA虚拟机运行。每个JVM是一个基本的agents容器,它为agent的执行提供完全运行时环境,并允许若干agents在同一台主机上并行执行。创建主容器或front-end,它是AMS和DF存在以及RMI注册的agent容器,被JADE内部使用。其它agent容器与主容器相连,为任何JADE agents的执行提供完全运行时环境。

Agent类

agent生命周期

根据FIAP规范中的AP生命周期理论,JADE agent可以处于若干状态中的一种,如图3所示,下面将详细介绍:

l 创建:创建agent对象,但没有在AMS上注册,也没有名字和地址,不能其它agents通信。

l 活动:agent对象在AMS上注册,有一个合格的名字和地址,可以访问所有JADE特征。

l 挂起:agent对象当前被停止。它的内部线程被暂停,没有agent行为被执行。

l 等待:agent对象被阻塞,等待什么。它的内部线程处于睡眠状态,当一些条件满足时被唤醒(典型地是消息到达)。

l 删除:agent明确地死亡。内部线程终止它的执行,agents不再注册在AMS上。

l 转移:当移动agent向新的地址迁移时进入这个状态。系统连续缓存消息,之后将发往它的新的地址。

Agent类提供公共方法使其在各种状态间转换,这些方法从FIPA规范agent管理中的有限状态机(the Finite State Machine)内的适当的转换中获取它们的名字。

例如,doWait()方法把agent从活动的状态转变为等待状态,doSuspend()方法把agent从活动或等待状态转变为挂起状态,…参考agent类的HTML文档,它提供这些doXXX()方法的完整列表。

注意:只有在活动状态下,代理才能执行它的行为(即它的任务)。小心:如果任何一个行为调用doWait()方法,那么整个agent和它的所有活动都将被阻塞,而不仅仅是调用该方法的行为。block()方法是Behaviour类的一部分,它允许单个agent行为挂起。

  • 运行配置–基于idea

  • JADE框架根据如下步骤控制一个新agent的产生:执行了agent的构造器,赋予agent一个ID(详情见HTML文档中jade.core.AID类),注册到AMS上,处于活动状态,最终执行setup()方法。通过getAID()得到agent的标识。
    任何行为都可以调用Agent.doDelete()方法来停止agent执行。
    当agent准备转到删除状态,即它将要被销毁,就要执行Agent.takeDown()方法。程序员可以通过重载takeDown()方法来实现任何必须的清除行动。当调用这个方法时,agent仍然是注册到AMS上的,因此可以发送消息到其他的agent,但是只要在takeDown()方法完成之后,agent就会被注销,它的线程也会被销毁。

    启动agent执行

    JADE框架根据一下步骤控制新的agent的诞生:执行agent构造器,给agent赋一个标识符(见jade.core.AID类的HTML文档),在AMS上注册,进入活动状态,最后执行setup()方法。根据FIPA规范,agent标识符有一下属性:

    l 一个全局唯一的名字。默认情况下由JADE用本地名字串联组成——例如,命令行提供的agent名字加上“@”,再加上本地AP标识符——例如’:’ ’/’ ‘JADE’);还有一种情况在命令行说明平台名字,本地名字加上‘@’加上规定的平台名字串联组成agent名字。

    l 一系列agent地址。每个agent继承本地agent平台的传输地址。

    l 一系列解释器,例如agent注册用的白页服务。

    setup()方法是应用程序定义的agent活动开始的点。程序员要想初始化agent,必须执行setup()方法。setup()方法执行后,agent就已在AMS上注册,它的AP状态处于活动状态。程序员应该用以下初始化程序:

    —(可选的)如果需要,修改AMS注册数据

    —(可选的)如果需要,设置agent的描述和它提供的服务,以及在一个或多个域注册agent,比如DFs(见3.1.2)

    —(必选的)用addBehaviour()方法添加任务到准备好的任务队列。

    一旦setup()方法结束,就安排这些行为。

    setup()方法给agent至少添加一个行为。setup()方法结束后,JADE自动执行准备好的任务队列中的第一个行为,然后用无优先的循环调度方法切换到队列中的其它行为。Agent类的addBehaviour(Behaviour)和removeBehaviour(Behaviour)方法可以用于管理任务队列。

    停止agent执行

    任何行为都可以调用Agent.doDelete()方法来停止agent运行。

    当agent将要进入DELETED状态时,运行Agent.takeDown()方法,例如agent被销毁的时候。takeDown()方法可以被程序员重写以执行任何必要的清理。当这个方法执行的时候,agent仍然注册在AMS上,从而可以给其它agents发送消息,但是takeDown()方法完成后,agent将注销,它的线程也将被销毁。这个方法想要的目的的执行程序指定的清除操作,如DF agents上的注销。

  • Behaviour类

    • Agent的实际工作包含在行为(Behaviour类)中,一个行为表示Agent携带的任务,继承jade.core.Behaviours类。
      Behaviour类都包含两个抽象方法。action()方法定义了行为执行时Agent需要进行的工作,done()方法返回一个boolean型的变量,显示行为是否执行完整并从Agent行为执行队列中删除。行为定义好后,通过addBehaviour()方法添加到Agent上。Behavious类还有很多子类,分别对应着不同类型的Behaviour,包括SimpleBehaviour,SequencesBehaviour,ParallelBehavior,CyclicBehavior等。

    • agent线程生命周期

      • SimpleBehaviour类

        1.OneShotBehaviour:立即完成且其 action() 方法仅执行一次的“一次性”行为。
        jade.core.behaviours.OneShotBehaviour 已经通过返回 true 实现了 done() 方法,并且可以方便地扩展以实现一次性行为。

        public class MyOneShotBehaviour extends OneShotBehaviour {public void action() {// perform operation X}
        }
        

        2.CyclicBehaviour:永远不会完成的“循环”行为,其 action() 方法在每次调用时都执行相同的操作。 jade.core.behaviours.CyclicBehaviour 已经通过返回 false 实现了 done() 方法,并且可以方便地扩展以实现循环行为。

        public class MyCyclicBehaviour extends CyclicBehaviour {public void action() {// perform operation Y}
        }
        

        JADE 提供了两个现成的类(在 jade.core.behaviours 包中),通过它们可以轻松实现在给定时间点执行某些操作的行为。

        3.WakerBehaviour 的 action() 和 done() 方法已经实现,在给定的时间(在构造函数中指定)到期后执行 handleElapsedTimeout() 抽象方法。 执行 handleElapsedTimeout() 方法后,行为完成。

        public class MyAgent extends Agent {protected void setup() {System.out.println(“Adding waker behaviour”);addBehaviour(new WakerBehaviour(this, 10000) {protected void handleElapsedTimeout() {// perform operation X}} );}
        }
        

        4.TickerBehaviour 的 action() 和 done() 方法已经以这样一种方式实现,即在每次执行后重复等待给定时间段(在构造函数中指定)执行 onTick() 抽象方法。 TickerBehaviour 永远不会完成。

        public class MyAgent extends Agent {protected void setup() {addBehaviour(new TickerBehaviour(this, 10000) {protected void onTick() {// perform operation Y}} );}
        }
        

        5.SequentialBehaviour

        这个类是一个CompositeBehaviour,它按顺序执行它的子行为,当所有的子行为执行完毕,它也就终止了。当一个复杂的任务可以表示为一系列原子步骤的时候使用这个类。

        6.ParallelBehaviour

        这个类是一个CompositeBehaviour,它并行执行它的子行为,当关于它的子行为的一个特殊条件满足时,它就终止。在这个类的构造器中指明的恰当的变量用来创建ParallelBehaviour,当它所有的子行为完成的时候,它的子行为当中的任何一个终止的时候或者用户定义的N号子行为完成的时候,它就结束。当一个复杂的任务可以表示为一个并行替代操作的集合和一些子任务终止条件的时候使用这个类。

Agent通信

JADE Agent提供的最重要的特性之一是通信能力。 采用的通信范式是异步消息传递。 每个Agent都有一种邮箱(Agent消息队列),JADE 运行时在其中发布其他Agent发送的消息。 每当在消息队列中发布消息时,都会通知接收Agent。 然而,如果Agent真正从消息队列中提取消息进行处理,则完全取决于程序员。

  • 消息格式遵循FIPA-ACL消息结构,每条消息包括以下几个内容:
      1)sender:消息的发送者,用Agent标志AID表示。
      2)receivers:接受Agent消息的Agent,可以是多个。
      3)Reply-to:应收到回应的接受者。
      4)Performative:通信行为或称通信原语,标志发送消息的目的,即发送者想要通过发送消息干什么。通常有这样一些常值:REQUEST,INFORM,ACCEPT_PROPOSAL,REJECT_PROPOSAL,PROPOSE等。如REQUEST表示发送者希望接收者执行一个特定的任务,INFORM表示发送者希望接收者了解一些事情,PROPOSE或者CFP(Call For Proposals)表示发送者希望进行一次谈判。
      5)Content:消息的内容。
      6)Language:内容语言,比如内容的编码格式。
      7)ontology:双方都能够理解的消息内容的概念说明和语义描述。
public class Sender extends Agent{public void setup() {addBehaviour(new Behaviour() {private boolean finished = false;@Overridepublic void action() {// TODO 自动生成的方法存根doWait(5000);ACLMessage acl=new ACLMessage(ACLMessage.INFORM); //通知AID r=new AID();r.setLocalName("Rec");  //设置接收Agent的本地名acl.addReceiver(r);     //添加到ACL消息中acl.setSender(getAID());  //设置发送者本地名,这里可以省略acl.setContent("Hello,Rec"); //设置内容send(acl);   //向Rec发送消息System.out.println("local name is:" + getLocalName());System.out.println(getLocalName()+" send Hello to Rec");System.out.println("the content is : "+acl.getContent());System.out.println("send finished");doWait(5000);  finished=true;doDelete();}@Overridepublic boolean done() {// TODO 自动生成的方法存根return finished;}});}
}
public class Receiver extends Agent {public void setup() {addBehaviour(new CyclicBehaviour() {@Overridepublic void action() {// TODO 自动生成的方法存根ACLMessage acl1=receive();if(acl1!=null) {System.out.println("receiving");doWait(2000);System.out.println(getLocalName()+" receive a message");System.out.println("the message is: "+acl1.getContent());System.out.println("the message is: "+acl1.getSender().getLocalName());doDelete();}}});}
}

JADE(Java Agent Development Framework)笔记相关推荐

  1. 说实话,你工作5年,不知道什么是Java agent技术,让我很吃惊...

    注:本文定义-在函数执行前后增加对应的逻辑的操作统称为MOCK. 引子 在某天与QA同学进行沟通时,发现QA同学有针对某个方法调用时,有让该方法停止一段时间的需求,我对这部分的功能实现非常好奇,因此决 ...

  2. java agent技术原理及简单实现

    注:本文定义-在函数执行前后增加对应的逻辑的操作统称为MOCK 1.引子 在某天与QA同学进行沟通时,发现QA同学有针对某个方法调用时,有让该方法停止一段时间的需求,我对这部分的功能实现非常好奇,因此 ...

  3. Java基础篇 学习笔记

    List item Java基础篇 学习笔记 java基础篇 第1章 计算机.程序和java概述 学习笔记 1.1什么是计算机 简单来说:计算机就是 ' 存储 ' 和 ' 处理 ' 数据的电子设备. ...

  4. java/android 设计模式学习笔记(1)--- 单例模式

    前段时间公司一些同事在讨论单例模式(我是最渣的一个,都插不上嘴 T__T ),这个模式使用的频率很高,也可能是很多人最熟悉的设计模式,当然单例模式也算是最简单的设计模式之一吧,简单归简单,但是在实际使 ...

  5. 写那么多年Java,还不知道啥是Java agent 的必须看一下!

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者信息:张帅,花名洵澈,国际化中台事业部高级开发工程师,负责物流 ...

  6. 我的天,你工作5年了,连Java agent都不知道...

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 # 引言 在本篇文章中,我会通过几个简单的程序来说明 agent ...

  7. Android SDK Tools Setup 提示 “ java se development kit not found”

    使用 installer_r11-windows.exe:安装Android SDK. 使用exe安装会自动检测是否配置好JDK. 当安装和配置完JDK后,运行安装程序依旧会提示 java se de ...

  8. Java加密与解密笔记(三) 非对称加密

    非对称的特点是加密和解密时使用的是不同的钥匙.密钥分为公钥和私钥,用公钥加密的数据只能用私钥进行解密,反之亦然. 另外,密钥还可以用于数字签名.数字签名跟上文说的消息摘要是一个道理,通过一定方法对数据 ...

  9. (CZ深入浅出Java基础)线程笔记

    这是刘意老师的JAVA基础教程的笔记 讲的贼好,附上传送门 传智风清扬-超全面的Java基础 一.线程的引入 1.多线程概述 进程 a.正在运行的程序,是系统进行资源分类和调用的独立单位. b.每个进 ...

  10. java.util.List学习笔记

    概述 在Java中,List是一种特殊的集合结构,即:List是一种有序的集合.在List接口的实现中,需要提供根据列表下表对元素进行操作的方法,包括:插入,删除,查询和修改等: List一般允许重复 ...

最新文章

  1. 机器学习:循环神经网络知识要点
  2. Xamarin.iOS提供没有匹配的配置文件
  3. LightOJ 1422:Halloween Costumes(区间DP入门)
  4. list修改元素的值_第115天:Python 到底是值传递还是引用传递
  5. Hbase的应用场景、原理及架构分析(转:https://blog.csdn.net/xiangxizhishi/article/details/75388971)
  6. 玩通信设备的,来这里学习
  7. ffmpeg libx264_编程小短文:FFmpeg视频画面尺寸调整,必知必会
  8. php 数组元素分类,数组分类、定义及遍历
  9. 蔚来召回4803辆ES8电动汽车 自燃原因找到了?
  10. 摩拜免押金;滴滴外卖订单骤降;小米最快本周 IPO | CSDN极客头条
  11. MySQL一个语句查出各种整形占用字节数及最大最小值
  12. 骑士CMS模版注入+文件包含getshell漏洞复现
  13. 国产达梦数据库安装教程(DM7,Windows)
  14. 新唐(nuvoton)MCU软件开发指南—环境搭建设置
  15. PHP实现生成小程序二维码带参数进入指定页面、小程序URL scheme实现携带数据跳转小程序
  16. 查看lv大小 linux,扩展AIX上的LV大小
  17. 学习笔记| AS入门(三) 布局篇
  18. Android中的进程间通信(IPC机制)
  19. 杀毒软件Clam AntiVirus的配置
  20. matlab潮流计算求节点自导纳,大神们,求个电力系统潮流计算的matlab程序。

热门文章

  1. 相机下载_索尼相机怎样用wifi传照片到手机
  2. 苹果官方下载_苹果官方发布的2018年应用榜单里,有安卓也能下载的抠图神器!...
  3. 黑马python5.0课件_2020整理的黑马python 5.0新课程体系零基础到就业大实战
  4. cad画正弦曲线lisp_cadlisp基础教程.pdf
  5. Linux Centos7 测试硬盘IO速度
  6. 电压跟随器Voltage Follower
  7. intouch与PLC之间通讯状态监测和设置
  8. CISP 考试教材《第 10 章 知识域:软件开发安全》知识整理
  9. CISP证书有什么作用?考试难度大吗?
  10. 项目管理前话001——商业模式画布