美文网首页
第八章 JADE学习 - 使用Agent提供的黄页服务

第八章 JADE学习 - 使用Agent提供的黄页服务

作者: 2010jing | 来源:发表于2020-05-12 03:01 被阅读0次

黄页服务

JADE中使用DF(Directory Facilitator)Agent提供的黄页服务。黄页服务允许Agent发布它所提供的一个或多个功能,以便其他Agent可以方便的发现和使用它们。任何Agent都可以注册服务和搜索服务,在Agent生命周期内都可以登录、注销、修改和搜索服务。

这个比较好理解,DF相当于一个目录服务器,每个提供服务的Agent可以向DF注册其服务,然后,其他的Agent可以从DF中查询该类服务,也可以订阅这类服务,如果是后者,那么一旦这类服务被注册到DF中,则订阅方就可以收到。

JADE提供jade.domain.DFService类,通过调用一系列方法来实现发布和搜索服务。
发布任务,三部曲:

  1. 建立一个适当的描述,需要 DFAgentDescription类
  2. 服务的具体设置包括服务的名称、类型、语言、属性等,需要 ServiceDescription类
  3. 服务的注册, 需要 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,

启动 DFSubscribeAgent

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

再启动一个DFRegisterAgent

在终端可以看到打印信息:

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

相关代码

https://gitee.com/2010jing/JADE-tutorial/tree/tutorial08/

相关文章

网友评论

      本文标题:第八章 JADE学习 - 使用Agent提供的黄页服务

      本文链接:https://www.haomeiwen.com/subject/synmnhtx.html