JADE学习【4】
Agent搜索:黄页服务
黄页服务允许Agent发布它提高那个的一个或多个功能,以便其他Agent可以方便地发现和使用它们。
任何Agent够可以注册(发布)服务和搜索(发现)服务,在Agent声明周期内部都可以进行登记、注销、修改和搜索服务。
JADE提供jade.domain.DFService类,通过调用一系列方法实现发布和搜索服务。
抽象对象为DFAgentDescription类、ServiceDescription类、和Property类
为了发布一个服务,Agent必须建立一个适当地描述(作为DFAgentDescription类的实例),然后调用DFService类的register()静态方法。
DFAgentDescription dfd = new DFAgentDescription();
ServiceDescription sd = new ServiceDescription();
dfd.setName(getAID());
sd.setType(...);
sd.setName(...);
dfd.addServices(sd);
DFService.register(this,dfd);
当终止一个Agent的时候,应当同时注销其提供的服务:
protected void takeDown()
{
try{
DFService.deregister(this);
}catch(FIPAException fe){
fe.printStackTrace();
}
}
Agent需要执行搜索服务时,必须向DF提供一个模板描述。搜索的结果是所有与模板描述匹配的服务列表。如果模板中给定的参数与服务描述中对应的参数值相同,认为该服务描述与模板匹配。
DFAgentDescription template = new DFAgentDescription();
ServiceDescription sd = new ServiceDescription();
sd.setType(....);
template.addServices(sd);
DFAgentDescription[] result = DFService.search(myAgent,template)
从一个外部Java应用启动JADE
JADE运行由jade.core.Runtime类实现。根据单独模式,这个类的一个实例存在于一个JVM中,可以通过instance()静态方法搜索。单个Runtime实例提供了两种方法:createMainContainer()用于创建一个JADE主容器;createAgentContainer()用于创建一个JADE外围容器。这两种方法都需要一个Profile文件对象作为参数,配置JADE开始运行时所需的参数选项(主容器的主机名和端口号)。用命令行启动JADE需要设定的所有参数项在Profile类中作为常量使用,并且通过调用setParameter(String key,String value)函数在配置文件中设置。
createMainContainer()函数和createAgentContainer()函数都返回一个jade.wrapper.ContainerController对象。ContainerController类的creatNewAgent()函数返回一个AgentController对象。createNewAgent()方法创建Agent实例,但不启动它,调用返回的AgentController对象的start()方法才是启动Agent的唯一途径。
public AgentController startBuyerAgent(String host,String port,String name){
//jade环境主容器 host
//jade环境主容器端口port
Runtime rt = Runtime.instance();
Profile p = new ProfileImpl();
p.setParameter(Profile.MAIN_HOST,host);
p.setParameter(Profile.MAIN_PORT,port);
ContainerController cc = runtime.createAgentContainer(p);
if(cc!= null){
try{
AgentController ac = WBcc.createNewAgent(name,"bookTrading.buyer.BookBuyerAgent",null);
ac.start();
return ac;
}
catch(Exception e){
e.printStackTrace();
}
}
return null;
}