黄页服务
JADE中使用DF(Directory Facilitator)Agent提供的黄页服务。黄页服务允许Agent发布它所提供的一个或多个功能,以便其他Agent可以方便的发现和使用它们。任何Agent都可以注册服务和搜索服务,在Agent生命周期内都可以登录、注销、修改和搜索服务。
这个比较好理解,DF相当于一个目录服务器,每个提供服务的Agent可以向DF注册其服务,然后,其他的Agent可以从DF中查询该类服务,也可以订阅这类服务,如果是后者,那么一旦这类服务被注册到DF中,则订阅方就可以收到。
JADE提供jade.domain.DFService类,通过调用一系列方法来实现发布和搜索服务。
发布任务,三部曲:
- 建立一个适当的描述,需要 DFAgentDescription类
- 服务的具体设置包括服务的名称、类型、语言、属性等,需要 ServiceDescription类
- 服务的注册, 需要 DFService类提供的 register()方法
注册服务
package cn.bcrab.agent;
import jade.core.Agent;
import jade.domain.DFService;
import jade.domain.FIPAAgentManagement.DFAgentDescription;
import jade.domain.FIPAAgentManagement.Property;
import jade.domain.FIPAAgentManagement.ServiceDescription;
import jade.domain.FIPAException;
import jade.domain.FIPANames;
public class DFRegisterAgent extends Agent {
@Override
protected void setup() {
String serviceName = "unknown";
// 从命令行的参数中读取服务的名称,默认为unknown
Object[] args = getArguments();
if (args != null && args.length > 0) {
serviceName = (String) args[0];
}
System.out.println("Agent: " + getLocalName() + " registering service: " + serviceName + " of financial-forecast");
try {
DFAgentDescription dfd = new DFAgentDescription(); //引入agent描述实例
dfd.setName(getAID());
ServiceDescription sd = new ServiceDescription(); //引入agent服务描述
sd.setName(serviceName); //设置服务名称
sd.setType("financial-forecast"); //设置服务类型
sd.addOntologies("financial-forcast-ontologies"); //设置服务本体
sd.addLanguages(FIPANames.ContentLanguage.FIPA_SL);// 设置交互语言, 使用服务的一方必须遵循的规范
sd.addProperties(new Property("location","China")); // 设置服务属性
dfd.addServices(sd);
DFService.register(this,dfd); //调用register()方法实现注册
} catch (FIPAException e) {
e.printStackTrace();
}
}
}
搜索服务
package cn.bcrab.agent;
import jade.core.AID;
import jade.core.Agent;
import jade.core.behaviours.SimpleBehaviour;
import jade.domain.DFService;
import jade.domain.FIPAAgentManagement.DFAgentDescription;
import jade.domain.FIPAAgentManagement.Property;
import jade.domain.FIPAAgentManagement.ServiceDescription;
import jade.domain.FIPAException;
import jade.domain.FIPANames;
public class DFSearchAgent extends Agent {
@Override
protected void setup() {
final DFSearchAgent that = this;
SimpleBehaviour sb = new SimpleBehaviour() {
private boolean done = false;
@Override
public void action() {
try {
DFAgentDescription dfd = new DFAgentDescription(); //引入agent描述实例
dfd.setName(getAID());
ServiceDescription sd = new ServiceDescription(); //引入agent服务描述
sd.setName("financial-forecast"); //设置服务名称
sd.setType("financial-forecast"); //设置服务类型
sd.addOntologies("financial-forcast-ontologies"); //设置服务本体
sd.addLanguages(FIPANames.ContentLanguage.FIPA_SL);// 设置交互语言, 使用服务的一方必须遵循的规范
sd.addProperties(new Property("location","China")); // 设置服务属性
dfd.addServices(sd);
DFService.register(that,dfd);
DFAgentDescription[] result = DFService.search(myAgent, dfd);
System.out.println("Found the following agents:");
AID[] agents = new AID[result.length];
for (int i = 0; i < result.length; ++i) {
agents[i] = result[i].getName();
System.out.println(agents[i].getName());
}
} catch (FIPAException e) {
e.printStackTrace();
}finally {
done = true;
}
}
@Override
public boolean done() {
return done;
}
};
this.addBehaviour(sb);
}
}
搜索服务运行结果:
Found the following agents:
DFSearchAgent@Platform
订阅服务
package cn.bcrab.agent;
import jade.core.AID;
import jade.core.Agent;
import jade.domain.DFService;
import jade.domain.FIPAAgentManagement.DFAgentDescription;
import jade.domain.FIPAAgentManagement.Property;
import jade.domain.FIPAAgentManagement.SearchConstraints;
import jade.domain.FIPAAgentManagement.ServiceDescription;
import jade.domain.FIPAException;
import jade.lang.acl.ACLMessage;
import jade.proto.SubscriptionInitiator;
import java.util.Iterator;
public class DFSubscribeAgent extends Agent {
@Override
protected void setup() {
// Build the description used as template for the subscription
DFAgentDescription template = new DFAgentDescription();
ServiceDescription templateSd = new ServiceDescription();
templateSd.setType("weather-forecast");
templateSd.addProperties(new Property("location", "China"));
template.addServices(templateSd);
SearchConstraints sc = new SearchConstraints();
// 最多能接受10个结果
sc.setMaxResults(10L);
SubscriptionInitiator subscription = new SubscriptionInitiator(this, DFService.createSubscriptionMessage(this, getDefaultDF(), template, sc)) {
@Override
protected void handleInform(ACLMessage inform) {
System.out.println("Agent " + getLocalName() + ": Notification received from DF");
try {
DFAgentDescription[] results = DFService.decodeNotification(inform.getContent());
if (results.length>0){
for(int i=0;i<results.length;i++){
DFAgentDescription dfd = results[i];
AID provider = dfd.getName();
// 同一个Agent可能提供很多服务,本例只对 financial-forecast 感兴趣
Iterator it = dfd.getAllServices();
while (it.hasNext()){
ServiceDescription sd = (ServiceDescription)it.next();
if(sd.getType().equals("financial-forecast")){
System.out.println("financial-forecast service is found:");
System.out.println("- Service " + sd.getName()+ " provided by Agent " + provider.getName());
}
}
}
}
} catch (FIPAException e) {
e.printStackTrace();
}
}
};
this.addBehaviour(subscription);
}
}
首先我们运行 DFRegisterAgent,在终端我们会看到这样:
Agent: DFRegisterAgent registering service: unknown of financial-forecast
接下来我们在图形界面,启动 DFSubscribeAgent,

最后再启动一个DFRegisterAgent , 并且再添加参数 O: 12.34 H: 22.15 L:15:56 C:20.43

在终端可以看到打印信息:
Agent: DFRegisterAgent registering service: unknown of financial-forecast
5月 12, 2020 2:46:28 上午 jade.core.AgentContainerImpl startBootstrapAgents
信息: Container-Monitor agent activated
5月 12, 2020 2:46:28 上午 jade.core.AgentContainerImpl joinPlatform
信息: --------------------------------------
Agent container Main-Container@192.168.0.107 is ready.
--------------------------------------------
Agent: service1 registering service: O: 12.34 H: 22.15 L:15:56 C:20.43 of financial-forecast
网友评论