【问题标题】:How to send an ACLmessage in public method in Agent class如何在代理类的公共方法中发送 ACL 消息
【发布时间】:2015-02-19 10:11:12
【问题描述】:

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

这是我的代码:

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 将其发送给另一个代理。我认为我的代码是正确的,因为我的 TickBehaviour 工作正常。

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

感谢您的回复:)

【问题讨论】:

    标签: java agents-jade


    【解决方案1】:

    您必须在发送消息时设置模板并将其与会话 ID 匹配。接收消息的代理必须检查模板是否匹配。

    【讨论】:

      【解决方案2】:

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

      解决此问题的一种方法是使用 OneShotBehaviour(),它会自动执行一次并自动完成。另一种选择是在成功发送您的消息后 [在 'send(message);'] 之后立即将变量设置为 'true' 并让 done() 返回此变量。

      建议:尽可能使用预定义的行为类型以避免一些令人头疼的问题 [OneShotBehaviour、SimpleBehaviour 等]。

      【讨论】:

      • 在消息发送后将变量设为真正是我所做的。感谢您的回复=)
      • 如果你在 done() 方法中返回那个 'true' 变量,那应该可以工作。
      猜你喜欢
      • 1970-01-01
      • 2018-02-02
      • 1970-01-01
      • 1970-01-01
      • 2010-10-08
      • 2011-01-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多