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

黄页服务

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/

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,736评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,167评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,442评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,902评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,302评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,573评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,847评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,562评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,260评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,531评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,021评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,367评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,016评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,068评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,827评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,610评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,514评论 2 269