我在使用一个代理接收多封邮件时遇到问题。
以下是我的代码。 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;
}
});
}
答案 0 :(得分: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;
}
另外,调整你的“行为完整”的满足标准。这样您就可以收到来自两个代理的消息,但是在没有完成的情况下收到多条消息。