Java JADE中acl消息的问题
我写了一个程序,一切看起来都很好。。但在运行时,代理会混淆消息。例如,我有以下代码:Java JADE中acl消息的问题,java,agents-jade,Java,Agents Jade,我写了一个程序,一切看起来都很好。。但在运行时,代理会混淆消息。例如,我有以下代码: ACLMessage msg = new ACLMessages (ACLMessage.INFORM); msg.setContent = ("G" + groupID); for(int i =0 ; i<50 ; i++){ msg.addReceiver(new AID("MyClass" + i, AID.ISLOCALNAME)); } send (msg); 假设我在程序的另一部分
ACLMessage msg = new ACLMessages (ACLMessage.INFORM);
msg.setContent = ("G" + groupID);
for(int i =0 ; i<50 ; i++){
msg.addReceiver(new AID("MyClass" + i, AID.ISLOCALNAME));
}
send (msg);
假设我在程序的另一部分中定义了另一条ACLMessage,例如msg2。。在另一个街区。。使用content=“T”+温度
当我收到下一条信息时,我意识到这些信息很混乱。。。它们没有得到适当的接收。我的意思是运行下面的代码有两种不同的结果:
System.out.println("rcv Content is: " + rcv.getContent());
结果是:G1
有时是:T34
这个错误的消息使我的程序无法正确运行。。。我更改了消息格式,如:“T”+groupID+“T”或其他形式。。。但是它不起作用
///////////////////////////////////////////////////
在我学会使用消息模板之后:
case 17:{// in this case deligates send the avg to the supervisor
if(!deligateFlag){
state++;
break;
}
ACLMessage msg = new ACLMessage(ACLMessage.INFORM);
msg.setConversationId("A");
msg.setContent("V" + avg);
//System.err.println("Content of rcv is: " + msg.getContent());
msg.addReceiver(mySupervisor);
send(msg);
System.out.println(myAgent.getLocalName()
+ " Says: I am deligate of group "
+ group
+ " And I sent the average temp of my followers "
+ "to the supervisor which is: "
+ mySupervisor.getLocalName());
state++;
break;
}
case 18:{/* in this case supervisor receives the avg temp of
each group and calculates the avg of averages and then
decides what to do*/
if(!supervisorFlag){
n=1;
state++;
break;
}
//System.err.println("This is Beginning of case 18");
if(supervisorFlag){
MessageTemplate mt = MessageTemplate.MatchConversationId("A");
ACLMessage msg = myAgent.receive(mt);
if (msg != null) { System.err.println("TContent is: " + msg.getContent());
dAvg += Character.getNumericValue(msg.getContent().charAt(1));
if(msg.getContent().charAt(0) == 'V'){
n++;
System.err.println("N is: " + n);
}
}
if(n > 4){
dAvg /= 4;
totalAvg = dAvg;
System.out.println("Supervisor "
+ myAgent.getLocalName()
+ "Says: The total average of whole system is: "
+ totalAvg);
}
state++;
break;
问题是,在最好的情况下,程序运行到
if(n>4)
。。一切都停止了。。没有错误,没有警告。。它就停了。。即使n变为5,但什么也没发生。。。我不知道到底是什么问题。。无论是ACL消息还是我不知道。。。一般来说,我不知道为什么90%的程序不打印t内容。消息将发生什么情况。如果要接收特定的aclMessages,可以使用myAgent.receive(MessageTemplate t)
例如,您想要发送消息
代理1:
ACLMessage request = new ACLMessage(ACLMessage.REQUEST);
...
request.setConversationId("G");
myAgent.send(request)
您希望您的代理2只接收带有ConversationId=“G”的消息
代理2:
MessageTemplate mt = MessageTemplate.MatchConversationId("G");;
ACLMessage msg = myAgent.receive(mt);
if (msg != null) {
// Process it
...
} else {
block();
}
老实说,我不知道发生了什么事。你不喜欢点菜吗?或者您只想接收内容为(“G”+groupID”)的邮件?很抱歉我解释得不好。问题是我只想接收具有特定内容的消息。当我在它们后面写if时,程序不会转到if语句。例如:
ACLMessage msg=新的ACLMessage(ACLMessage.info);msg.setContent=(“G”+groupID);对于(int i=0;ihow about receive(MessageTemplate pattern)?我没有找到您在How is that?.中所说的函数。发布了答案,您可以在javadoc中看到此方法这些解决方案在几种情况下都有效,但有一种情况下我想知道为什么它不起作用,并且条件if(msg!=null)
总是错误的,这意味着代理没有接收到带有确切对话ID的消息。可能的原因是什么?
MessageTemplate mt = MessageTemplate.MatchConversationId("G");;
ACLMessage msg = myAgent.receive(mt);
if (msg != null) {
// Process it
...
} else {
block();
}