Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1261140
  • 博文数量: 135
  • 博客积分: 10588
  • 博客等级: 上将
  • 技术积分: 1325
  • 用 户 组: 普通用户
  • 注册时间: 2006-04-18 11:12
文章分类

全部博文(135)

文章存档

2013年(6)

2012年(3)

2011年(11)

2010年(7)

2009年(14)

2008年(6)

2007年(42)

2006年(46)

分类: Java

2006-12-25 16:27:03


很多朋友问到普通程序与Agent的交互,这里有了。

main函数中动态创建Agent可以通过先创建另一个容器,然后再这个容器中创建Aent的方法。比如:

public static void main(String[] args) {

        // TODO code application logic here

        Runtime rt = Runtime.instance();

        rt.setCloseVM(true);

        ContainerController cc =  rt.createAgentContainer(new ProfileImpl(false));

       

        AgentController pingAgent = null;

        try {

            // create agent and start it

            (cc.createNewAgent("hello", "jadeclient.HelloWorldAgent", new Object[0])).start();

        } catch (Exception e){}

    }

  

可以写如下测试程序,这里用netbeans平台,一个HelloWorldAgent,他将被动态创建并向主容器中的server发送一个消息:

package jadeclient;

 

/**

 *

 * @author admin

 */

import jade.core.*;

import jade.core.Agent;

import jade.core.AID;

import jade.lang.acl.ACLMessage;

import jade.core.behaviours.SimpleBehaviour;

 

public class HelloWorldAgent extends Agent {

    public void setup(){

           

            addBehaviour(new SimpleBehaviour(this){

                boolean finished=false;

                AID server = new AID( "server", AID.ISLOCALNAME );

                public void action()

                {

                    System.out.println("我的本地名称是:"+getLocalName());

                    ACLMessage msg = new ACLMessage(ACLMessage.INFORM);

                    msg.setContent("消息内容"  );

                    msg.addReceiver(server);

                    send(msg);

                    System.out.println("已经往主容器中的server发送信息#");

                    block( 1000 );

                                       

                   finished=true;

                 }

                 public boolean done()

                {

                   return finished;

                 }

 

            });

        

        };

}

server角色是收到消息后打印出来。

/*

 * ReceiverAgent.java

 *

 * Created on 2006年12月25, 下午3:28

 *

 * To change this template, choose Tools | Template Manager

 * and open the template in the editor.

 */

 

package jadeclient;

import jade.core.Agent;

import jade.core.AID;

import jade.core.behaviours.OneShotBehaviour;

import jade.core.behaviours.CyclicBehaviour;

import jade.lang.acl.ACLMessage;

/**

 *

 * @author admin

 */

public class ReceiverAgent extends Agent {

   

    /** Creates a new instance of ReceiverAgent */

   

    //把接收到的信息打印出来

    protected void setup()

    {

        addBehaviour(new CyclicBehaviour(this)

        {

             public void action() {

                ACLMessage msg= receive();

                if (msg!=null)

                    System.out.println( "收到信息 " +

                       myAgent.getLocalName() + " <- " +

                       msg.getContent() );

                block();

             }

        });

    }

 

}

所有类编译完成后,这里运行的时候先在命令行下java jade.Boot –gui,然后gui界面下创建一个名叫serverAgent,其类为jadeclient. ReceiverAgent.


然后运行main函数,成功后打印出的结果分别如上图,其中netbeans平台中下面显示的是hello打印出的信息,而命令行中显示的是server收到hello发的信息后打印出来的。可见不同容器中agent通信与在同一容器中通信并无二样。

阅读(5374) | 评论(9) | 转发(1) |
给主人留下些什么吧!~~

chinaunix网友2010-05-27 11:43:23

樓上的問題已自解~感謝~

chinaunix网友2010-05-27 11:15:03

您好 現在正在結合Spring、Agent,拜讀此篇文章,已能用class呼叫Agent 想請教如果是反向的,Agent要呼叫一般class,那又應該如何處理呢?

chinaunix网友2009-11-29 08:21:35

打扰一下,如果我要自己写一个UI能监视所有agent的状态,并直接获得agent里的一些数据,该怎么办?

bwbw7232009-05-04 11:47:30

不好意思打扰,我最近在做毕业设计,题目是基于本体的电子商务协议设计,看了不少您的文章,很受帮助,希望能得到一点您关于此题目建议,非常感谢。

chinaunix网友2008-06-09 23:49:38

请问在jade面板,new一个agent的时候,类的地址是不是要具体指到.class所在的地方? 我现在是没有找到类 谢谢