2016-05-13 112 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標準。因此您可以接收來自兩個代理的消息,但無需完成即可接收多個消息。