Jade Agent无法接收多个消息

时间:2016-05-13 12:02:47

标签: pug agent agents-jade

我在使用一个代理接收多封邮件时遇到问题。 以下是我的代码。 msg_r,代理接收始终是第一条消息。如何从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;
        }

    });

}

1 个答案:

答案 0 :(得分:1)

在JADE中,您应该注意消息在队列中被视为FIFO。这意味着没有MessageTemplate搜索您的消息队列的通用接收,代理将只获取其队列中最长的消息。看来你的行为将在收到Ko​​ordinatorAgent的消息后完成。因此,如果您的代理首先收到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;
}

另外,调整你的“行为完整”的满足标准。这样您就可以收到来自两个代理的消息,但是在没有完成的情况下收到多条消息。