JADE平台通信

时间:2015-11-01 19:07:41

标签: java agents-jade

基本上我尝试的方法与此处要求的相同:Passing ACL messages between jade remote platforms

我有两个程序分别创建两个主容器和一个代理。我在不同的机器上运行这两个程序,并希望从一个代理发送消息到另一个代理。在与上述相关的问题中提出的答案对我不起作用。接收方总是抛出java.lang.OutOfMemoryError,发送方显示:

jade.mtp.MTPException: Description: ResponseMessage is not OK

如果两个代理程序在不同计算机上的不同代理程序容器中运行但在同一主容器中运行,则发送消息,但这不是我尝试实现的目标。 希望你能帮帮我。

代码

发件人:

public class Main {

public static void main(String[] args) {

    Runtime runtime = Runtime.instance();

    Profile p = new ProfileImpl();
    p.setParameter(Profile.MAIN_HOST, "172.16.200.100");
    p.setParameter(Profile.MAIN_PORT, "1337");
    p.setParameter(Profile.CONTAINER_NAME,"Reality");

    AgentContainer agentContainer = runtime.createMainContainer(p);

    try {
        AgentController ac = agentContainer.createNewAgent("hitman",Agent47.class.getName(),null);
        ac.start();
        } catch (StaleProxyException e) {e.printStackTrace();}
    }
}

public class Agent47 extends Agent {

    private static final long serialVersionUID = 1L;

    @Override
    protected void setup() {

        ACLMessage msg = new ACLMessage(ACLMessage.INFORM); 
        AID dest = new AID("AgentSmith@Matrix",AID.ISGUID);
        dest.addAddresses("http://172.16.200.1:4242/acc");
        msg.addReceiver(dest);
        msg.setContent("Hello!");
        send(msg);
    }
}

接收器:

public class Main {

    public static void main(String[] args) {
        Runtime runtime = Runtime.instance();

        Profile p = new ProfileImpl();              
        p.setParameter(Profile.MAIN_HOST, "172.16.200.1");
        p.setParameter(Profile.MAIN_PORT, "4242");
        p.setParameter(Profile.CONTAINER_NAME,"Matrix"); 

        AgentContainer agentContainer = runtime.createMainContainer(p);

        try {
            AgentController ac = agentContainer.createNewAgent("AgentSmith",AgentSmith.class.getName(),null);
            ac.start();
        } catch (StaleProxyException e) {e.printStackTrace();}
    }
}

public class AgentSmith extends Agent {

    private static final long serialVersionUID = 1L;

    @Override
    protected void setup() {

        addBehaviour(new CyclicBehaviour(this){

            private static final long serialVersionUID = 1L;

            public void action() {
                 ACLMessage  msg = myAgent.receive();
                    if(msg != null){

                            String content = msg.getContent();
                            if (content != null) {
                                System.out.println("Received Request from "+msg.getSender().getLocalName());
                                System.out.println("Received Message : "+content);
                            }

                        }  
             }
        });

        System.out.println("Setup done!");
    }

}

1 个答案:

答案 0 :(得分:1)

解决了一些问题。如果其他人有同样的问题,这里我的解决方案: 我必须设置平台IP以及MTP主机的IP。

String host = "172.16.200.100"; // Platform IP
int port = 1099; // default-port 1099

String MTP_hostIP = "172.16.200.100"; 
String MTP_Port = "7778";

Runtime runtime = Runtime.instance();

Profile profile = new ProfileImpl(host, port, null, true);  
profile.setParameter(Profile.MTPS, "jade.mtp.http.MessageTransportProtocol(http://"+MTP_hostIP+":"+MTP_Port+"/acc)");

// create container
AgentContainer container = runtime.createMainContainer(profile);

try {
    AgentController ac = container.createNewAgent("AgentSmith",AgentSmith.class.getName(),null);
    ac.start();
} catch (StaleProxyException e) {
    e.printStackTrace();
}

事实证明,如果我使用 localhost 作为主机IP和 MTP主机的网络IP,那么通信在我的B类中将无法正常工作网络。将两个变量设置为相同的IP解决了这个问题。