Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/382.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 循环行为未捕获传入消息_Java_Agents Jade - Fatal编程技术网

Java 循环行为未捕获传入消息

Java 循环行为未捕获传入消息,java,agents-jade,Java,Agents Jade,这里是上下文:我正在从一个代理(比如说“senderAgent”)向另一个代理(“targetAgent”)发送一条消息:这里没有什么复杂的事情,至少看起来是这样。 消息传播类型为INFORM 以下是相关senderAgent部件的代码(在一次性行为中): 以及相关目标部件的代码(在循环行为中): 问题是:targetAgent永远不会捕获此消息。它确实是由我的senderAgent发送的,但targetAgent的循环行为似乎总是得到“null”消息(也称为“no message”) 我使用J

这里是上下文:我正在从一个代理(比如说“senderAgent”)向另一个代理(“targetAgent”)发送一条消息:这里没有什么复杂的事情,至少看起来是这样。 消息传播类型为INFORM

以下是相关senderAgent部件的代码(在一次性行为中):

以及相关目标部件的代码(在循环行为中):

问题是:targetAgent永远不会捕获此消息。它确实是由我的senderAgent发送的,但targetAgent的循环行为似乎总是得到“null”消息(也称为“no message”)

我使用Jade Console的嗅探器和内省工具进行调查

  • 嗅探器显示消息有效地从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();