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