Agent通信是JADE中最基本的功能,基于异步消息传递。每个Agent都有一个“邮箱”(Agent消息队列),JADE实时运行环境传递Agent发送的消息传递到邮箱内,通知接收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:双方都能够理解的消息内容的概念说明和语义描述。
发送消息时调用send()方法,接收消息调用Receive()方法。
简单实例:
发送者:l_3_ACL_cyc文件夹中建立类文件Sender
package l_3_ACL_cyc;
import jade.core.AID;
import jade.core.Agent;
import jade.core.behaviours.*;
import jade.lang.acl.ACLMessage;
public class Sender extends Agent{
public void setup() {
addBehaviour(new Behaviour() {
private boolean finished = false;
@Override
public 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();
}
@Override
public boolean done() {
// TODO 自动生成的方法存根