Циклическое поведение, не перехватывающее входящее сообщение

Вот контекст: я отправляю сообщение от одного агента (скажем, «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 никогда ничего не перехватывает?

Я чувствую себя совершенно потерянным, так как у меня впервые возникла эта проблема, и я успешно реализовал аналогичную связь между другими агентами моей системы...

Будем очень признательны за любую помощь, советы по отладке или идеи!


person Cécile Fecherolle    schedule 12.05.2014    source источник
comment
Если вы оставите matchSender вне?   -  person Joop Eggen    schedule 12.05.2014
comment
Тоже не работает, я избавился от всего MessageTemplate на стороне получателя и до сих пор ничего. Но я нашел решение! Выложил ниже.   -  person Cécile Fecherolle    schedule 13.05.2014


Ответы (1)


Итак, моя проблема на самом деле возникла из-за огромной ошибки проектирования в моей системе.

Действительно, у меня было два циклических поведения (в targetAgent), ожидающих сообщений с MessageTemplate, совпадающим с одним и тем же перформативом и одним и тем же отправителем (senderAgent). Затем оба эти поведения решают, делать что-то или нет, основываясь на проанализированном содержании сообщения. Поскольку это был глупый и очень плохой дизайн, объединение этих двух агентов в один и добавление туда условия, связанного с контентом, помогло.

Я узнал об этом, прочитав документацию JADE для метода «получить». Когда я увидел, что это «получение сообщения в очередь сообщений агента», все стало ясно: если в очереди нет сообщения, когда я пытаюсь получить, оно наверняка уже было получено другим поведением того же агента.

Что ж, дело закрыто!

person Cécile Fecherolle    schedule 13.05.2014
comment
Действительно, я начал использовать другой идентификатор разговора, и теперь он не работает. - person Cleber Jorge Amaral; 24.09.2017