外部应用程序调用Agent

来源:互联网 发布:ubuntu适配的手机型号 编辑:程序博客网 时间:2024/04/30 09:29

JADE2.3以后的版本都提供了in-process接口来实现外部应用程序对agent的调用。

我们可以通过jade.core.Runtime.instance()来获得jade运行时的一个单独得实例。有两种方法可以用来创建一个jade主容器和一个jade远程容器。主要调用过程如下:

 

先看简单的例子:

package inprocess;

import jade.core.*;

import jade.core.behaviours.*;

/**

 *

 * @author Administrator

 */

public class CustomAgent extends Agent{

     

    public void setup(){

        SimpleBehaviour helloBehaviour=new SimpleBehaviour(this) {

            boolean finished=false;

            public void action() {

                System.out.println("Hello World Behaviour run: 你好,世界!");

                System.out.println("-----我是:-----");

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

                System.out.println("我全局唯一的标志名称为:"+getName() );

                finished=true;

            }

            public boolean done() {

                return finished;

            }

           

        };

        addBehaviour(helloBehaviour);

    }

   

}以上是要调用的agent

package inprocess;

 

import jade.core.Runtime;

import jade.core.Profile;

import jade.core.ProfileImpl;

import jade.core.behaviours.SimpleBehaviour;

import jade.wrapper.*;

import jade.core.Agent;

public class InprocessTest  { 

   

 

    public static void main(String args[]) {

        try{

            Runtime rt = Runtime.instance();

            rt.setCloseVM(true);

            Profile pMain = new ProfileImpl(null, 8888, null);

            System.out.println("Launching a whole in-process platform..."+pMain);

            AgentContainer mc = rt.createMainContainer(pMain);

            // set now the default Profile to start a container

            ProfileImpl pContainer = new ProfileImpl(null, 8888, null);

            System.out.println("Launching the agent container ..."+pContainer);

            AgentController custom=mc.createNewAgent("custom","inprocess.CustomAgent",null);

            custom.start();           

         

       

        }

        catch (Exception e){

            e.printStackTrace();

        }

       

    }

}//以上是调用者,在netbeans中调试通过。

 

再看一个例子,也是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;

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 20061225, 下午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通信与在同一容器中通信并无二样。

原创粉丝点击