Java 如何在代理类的公共方法中发送ACLmessage

Java 如何在代理类的公共方法中发送ACLmessage,java,agents-jade,Java,Agents Jade,我对Jade和multi-agent系统相当陌生。 我正在尝试构建一个包含多个代理的系统,这些代理必须通过发送ACL消息进行通信。我已经阅读了有关如何构建代理类的结构的文档 这是我的密码: public class ServerCommunicationAgent extends Agent { public static String serverAddress = "http://LO-LESTER-077:8080"; private static final long s

我对Jade和multi-agent系统相当陌生。 我正在尝试构建一个包含多个代理的系统,这些代理必须通过发送ACL消息进行通信。我已经阅读了有关如何构建代理类的结构的文档

这是我的密码:

public class ServerCommunicationAgent extends Agent {
    public static String serverAddress = "http://LO-LESTER-077:8080";
    private static final long serialVersionUID = 1L;

    protected void setup() {
        System.out.println(getLocalName() + ": correctly started");
        boolean state = true;

        // A Class that has a socket with my server
        CommunicationService.getInstance().ServerCommunicationAgent(state); 

        // Sends a tick every millisecond
        addBehaviour(new TickerBehaviour(this, 10000) {
            private static final long serialVersionUID = 1L;
            @Override
            protected void onTick() {
                ACLMessage message = new ACLMessage(ACLMessage.INFORM);
                message.setContent("OK");
                message.setLanguage("English");
                message.setOntology("Test Dialogue");
                message.setConversationId("TestID");
                message.addReceiver(new AID("SecurityAgent", AID.ISLOCALNAME));
                send(message);
            }    
        }); 
    }

    // This method is called from CommunicationService when i have a response
    public void LaunchServiceAgent(final String Agent, final String Location){
        System.out.println(": Agent received service request: " + Agent + " in " + Location + " and has to call " + Agent + Location);

        addBehaviour(new Behaviour(this) {
            private static final long serialVersionUID = 1L;

            @Override
            public void action() {
                ACLMessage messages = new ACLMessage(ACLMessage.INFORM);
                messages.setContent("Hello world");
                messages.setLanguage("English");
                messages.setOntology("Test Dialogue");
                messages.setConversationId("TestID");
                messages.addReceiver(new AID(Agent + Location, AID.ISLOCALNAME));
                send(messages);
            }

            @Override
            public boolean done() {
                return false;
            }
       });
}
正如我在代码中解释的,当代理启动时,它会向我的服务器发送一条消息。它通过LaunchServiceAgent方法接收消息。我正确地收到了邮件,但无法使用ACLMessage将其发送给其他代理。我认为我的代码是正确的,因为我的行为很好

所以我的问题是,如何正确地从我的方法向另一个代理发送消息


感谢您的回复:)

您必须在发送邮件时设置一个模板,并将其与会话id匹配。接收邮件的代理必须检查模板是否匹配。

您的LauchServiceAgent(…)方法永远不会返回,因为您总是在done()方法中返回“false”。这可能会给您带来麻烦,因为您的方法永远不会结束,它会被卡住

解决这个问题的一个选项是使用OneShotBehavior(),它会自动执行一次并自动完成。另一个选项是在成功发送消息之后[在“发送(消息);”之后]立即将变量设置为“true”,并使done()返回此变量


建议:尽可能使用预定义的行为类型来避免一些麻烦[OneshotBehavior、SimpleBehaviour等]。

在消息发送后将变量设置为true正是我所做的。感谢您的回复=)如果您在done()方法中返回'true'变量,那么应该可以。