2016-05-13 1 views
0

У меня проблема с получением нескольких сообщений с одним агентом. следующий мой код. 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. поэтому вы можете получать сообщения от обоих агентов, но получать несколько сообщений без завершения.