Java 循环行为未捕获传入消息
这里是上下文:我正在从一个代理(比如说“senderAgent”)向另一个代理(“targetAgent”)发送一条消息:这里没有什么复杂的事情,至少看起来是这样。 消息传播类型为INFORM 以下是相关senderAgent部件的代码(在一次性行为中): 以及相关目标部件的代码(在循环行为中): 问题是:targetAgent永远不会捕获此消息。它确实是由我的senderAgent发送的,但targetAgent的循环行为似乎总是得到“null”消息(也称为“no message”) 我使用Jade Console的嗅探器和内省工具进行调查Java 循环行为未捕获传入消息,java,agents-jade,Java,Agents Jade,这里是上下文:我正在从一个代理(比如说“senderAgent”)向另一个代理(“targetAgent”)发送一条消息:这里没有什么复杂的事情,至少看起来是这样。 消息传播类型为INFORM 以下是相关senderAgent部件的代码(在一次性行为中): 以及相关目标部件的代码(在循环行为中): 问题是:targetAgent永远不会捕获此消息。它确实是由我的senderAgent发送的,但targetAgent的循环行为似乎总是得到“null”消息(也称为“no message”) 我使用J
- 嗅探器显示消息有效地从senderAgent发送到targetAgent
- 内省甚至显示消息是在发送方发送的,而在目标方接收的
任何帮助、调试提示或想法都将不胜感激 好的,所以我的问题实际上来自我的系统中的一个巨大的设计错误 事实上,我有两种循环行为(在targetAgent中)等待消息,消息模板匹配相同的执行变量和相同的发送者(senderAgent)。然后,这些行为都会根据解析的消息内容决定是否执行某些操作。由于这是一个愚蠢且非常糟糕的设计,将这两个代理融合为一个,并在其中添加与内容相关的条件就成功了 我通过阅读“receive”方法的JADE文档发现了这一点。当我看到它是“在代理的消息队列中获取消息”时,一切都变得清晰起来:如果在我尝试接收时队列中没有消息,那么它肯定已经被同一代理的另一个行为接收到
好了,案子结束了 如果你不使用matchSender?也不起作用,我去掉了接收方的整个MessageTemplate,但仍然一无所获。但我找到了解决办法!确实,我开始使用不同的conversationID,现在它开始工作了。
message = new ACLMessage(ACLMessage.INFORM);
message.addReceiver(new AID("targetAgent", AID.ISLOCALNAME));
message.setContent(jsonContent); // not important here
send(message);
MessageTemplate mt =
MessageTemplate.and(MessageTemplate.MatchPerformative(ACLMessage.INFORM),
MessageTemplate.MatchSender("senderAgent", AID.ISLOCALNAME));
ACLMessage msg = receive(mt);
if (msg != null) {
//do something
}
block();