2

这是上下文:我正在从一个代理(比如说“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 的循环行为似乎总是收到“空”消息(又名“无消息”)。

我使用 Jade Console 的 Sniffer 和 Introspector 工具进行调查。

  • 嗅探器显示消息有效地从 senderAgent 发送到 targetAgent。
  • Introspector 甚至显示消息在发送方发送并在目标方接收。

内容没问题,AID 没问题,为什么 targetAgent 的循环接收行为总是抓不到任何东西呢?

我感到很失落,因为这是我第一次遇到这个问题,并且我之前成功地在我系统的其他代理之间实现了类似的通信......

任何帮助、调试提示或想法将不胜感激!

4

1 回答 1

2

好的,所以我的问题实际上来自我系统中的一个巨大的设计错误。

事实上,我有两个循环行为(在 targetAgent 中)等待消息模板匹配相同的执行和相同的发送者 (senderAgent)。然后,这些行为都根据解析的消息内容决定是否做某事。由于这是愚蠢且非常糟糕的设计,将这两个代理融合为一个并在那里添加与内容相关的条件就可以了。

我通过阅读“接收”方法的 JADE 文档发现了这一点。当我看到它“在代理的消息队列中收到一条消息”时,一切都变得清晰:当我尝试接收时队列中没有消息,它肯定已经被同一个代理的另一个行为接收到了。

嗯,结案!

于 2014-05-13T01:58:22.007 回答