以下是上下文:我从一个代理发送消息(让他们说" senderAgent")到另一个代理(" targetAgent"):没什么复杂的在这里,或者看起来如此。 消息传播类型是INFORM。
以下是相关senderAgent部分的代码(在一次性行为中):
message = new ACLMessage(ACLMessage.INFORM);
message.addReceiver(new AID("targetAgent", AID.ISLOCALNAME));
message.setContent(jsonContent); // not important here
send(message);
相关targetAgent部分的代码(在循环行为中):
MessageTemplate mt =
MessageTemplate.and(MessageTemplate.MatchPerformative(ACLMessage.INFORM),
MessageTemplate.MatchSender("senderAgent", AID.ISLOCALNAME));
ACLMessage msg = receive(mt);
if (msg != null) {
//do something
}
block();
问题是:此消息永远不会被targetAgent捕获。它确实是由我的senderAgent发送的,但targetAgent的循环行为似乎总是得到" null"消息(又名"没有消息")。
我使用了Jade Console的Sniffer和Introspector工具进行调查。
内容没问题,AID没问题,为什么targetAgent的循环接收行为永远不会有任何影响?
我感到非常失落,因为这是我第一次遇到这个问题而且我之前在系统的其他代理之间成功实现了类似的沟通......
非常感谢任何帮助,调试技巧或想法!
答案 0 :(得分:2)
好的,所以我的问题实际上是来自我系统中的一个巨大的设计错误。
实际上,我有两个循环行为(在targetAgent中),等待消息与MessageTemplate匹配相同的性能和相同的发送者(senderAgent)。然后,基于解析的消息内容,这些行为都决定是否做某事。由于这是一个愚蠢而非常糟糕的设计,将这两个代理融合为一个并添加与内容相关的条件就可以解决这个问题。
我通过阅读"接收"的JADE文档找到了这一点。方法。当我看到它是"在代理的消息队列"中收到消息时,一切都变得清晰:当我尝试接收时,队列中没有消息,它当然已经被收到了同一代理人的另一种行为。
好吧,案件结案了!