2016-05-13 76 views
0

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

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

在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; 
} 

Altenatively,调整你的“的行为完全” satifsfaction标准。因此您可以接收来自两个代理的消息,但无需完成即可接收多个消息。