2016-05-13 41 views
0

Ich habe ein Problem mit dem Empfang mehrerer Nachrichten mit einem Agenten. Folgendes ist mein Code. msg_r, welcher Agent empfangen ist immer die erste Nachricht. wie kann ich die zweite Nachricht von getSender().getLocalName().equals("TeilsystemAgent")Jade Agent kann keine Mehrfachnachrichten empfangen

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

    }); 

} 

Antwort

1

In JADE erhalten, sollten Sie beachten, dass Nachrichten als FIFO innerhalb der Warteschlange behandelt werden. Das bedeutet, dass ein Agent ohne eine MessageTemplate-Suche Ihrer Nachrichtenwarteschlange empfangen wird. Der Agent nimmt nur die Nachricht, die am längsten in der Warteschlange war. Es scheint, dass dein Verhalten abgeschlossen wird, nachdem du eine Nachricht von KoordinatorAgent erhalten hast. Wenn Ihr Agent also zuerst eine KoordinatorAgent-Nachricht empfängt, wird diese zuerst verarbeitet und der Boolesche Wert wird ausgelöst, damit Ihr Verhalten beendet wird.

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, optimieren Sie Ihre "Verhalten complete" satifsfaction Kriterien:

Stattdessen mehrere Nachrichten von verschiedenen Formen, implementieren MessageTemplates in der Reihenfolge, in der sie empfangen müssen zu empfangen. Sie können also Nachrichten von beiden Agenten empfangen, aber mehrere Nachrichten empfangen, ohne sie abzuschließen.