【问题标题】:Jade Agent cannot receive multi msgJade Agent 无法接收多条消息
【发布时间】:2016-05-13 12:02:47
【问题描述】:

我在使用一个代理接收多条消息时遇到问题。 以下是我的代码。 msg_r,Agent 收到的始终是第一条消息。我怎样才能从getSender().getLocalName().equals("TeilsystemAgent")得到第二条消息

public class KomponenteAgent extends Agent {
    static JTextArea txt = gui.gettxt();
    private String AdminReceive = "";
    private String KompCheckReceive = "";
    private int Zaehler = 0;
    JSONArray Admin = new JSONArray();
    JSONArray KompCheck = new JSONArray();

protected void setup() {
    Object[] arg = getArguments();
    //frame = (IAPMS)arg[0];

    addBehaviour(new SimpleBehaviour(this) {
        private boolean finished = false;
        public void action() {
            ACLMessage msg_r = receive();               
            if (msg_r!= null){
                if (msg_r.getSender().getLocalName().equals("KoordinatorAgent"))
                    //Bestaetigung                                              
                    try {
                        TimeUnit.SECONDS.sleep(5);
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }

                    AdminReceive = AdminReceive + msg_r.getContent();
                    try {
                        Admin = new JSONArray(AdminReceive);
                        System.out.println(getLocalName()+ Admin);
                    } catch (JSONException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                    Zaehler = Zaehler + 1;
                }   

            if (msg_r!= null ){
                if (msg_r.getSender().getLocalName().equals("TeilsystemAgent"))
                    //Bestaetigung                                              
                    try {
                        TimeUnit.SECONDS.sleep(2);
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }                       
                KompCheckReceive = KompCheckReceive + msg_r.getContent();
                System.out.println(getLocalName()+ KompCheckReceive);
                try {
                    KompCheck = new JSONArray(KompCheckReceive);
                    System.out.println(getLocalName()+ KompCheck);
                    checkKomp(KompCheck);
                } catch (JSONException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }

            if (Zaehler == 1){
            finished = true;
            }
        }

        public boolean done(){
            return finished;
        }

    });

}

【问题讨论】:

    标签: pug agent agents-jade


    【解决方案1】:

    在 JADE 中,您应该注意消息在队列中被视为 FIFO。这意味着在没有 MessageTemplate 搜索您的消息队列的情况下进行通用接收,代理将只接收在其队列中最长的消息。在收到来自 KoordinatorAgent 的消息后,您的行为似乎将完成。因此,如果您的代理首先收到 KoordinatorAgent 消息,它将首先被处理并触发布尔值以结束您的行为。

    相反,要接收不同形式的多条消息,请按照您需要接收它们的顺序实现 MessageTemplates:

    ACLMessage msg_r = receive(MessageTemplate.MatchSender(new AID(TeilsystemAgent, ISLOCALNAME)));
    if(msg_r != null){
       // Treat incomming message as required
       TeilsystemAgent_messageCounter++;
    }
    
    if(TeilsystemAgent_messageCounter == expectedNumberofMessages){
       msg_r = receive(MessageTemplate.MatchSender(new AID(KoordinatorAgent, ISLOCALNAME)));
       // treat message as required
       Zaehler = Zaehler + 1;
    }
    

    或者,调整您的“行为完整”满意度标准。因此您可以接收来自两个代理的消息,但接收多条消息而未完成。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多