2014-05-12 3 views
2

다음은 컨텍스트입니다. 한 상담원 ("senderAgent"라고합시다)에서 다른 ("targetAgent")로 메시지를 보내고 있습니다. 여기서는 아무 것도 복잡하지 않거나 그렇게 보입니다. 메시지 전파 유형이 INFORM입니다.들어오는 메시지를 수신하지 않는 순환 동작

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(); 
다음

은 (원샷 동작 내부) 관련 senderAgent 부분에 대한 코드입니다

문제점 :이 메시지는 targetAgent에 의해 절대 포착되지 않습니다. 내 senderAgent에 의해 실제로 전송되지만 targetAgent의 주기적 동작은 항상 "null"메시지 (일명 "no message")를 얻는 것처럼 보입니다.

제이드 콘솔의 Sniffer 및 Introspector 도구를 사용하여 조사했습니다.

  • Sniffer는 메시지가 senderAgent에서 targetAgent로 효과적으로 전송됨을 보여줍니다.
  • Introspector는 메시지가 발신 측에서 보내지고 대상 측에서 수신되었음을 보여줍니다.

내용은 괜찮습니다. AID는 문제가 없으므로 왜 targetAgent의 주기적 수신 동작이 아무 것도 잡지 못합니다.

나는 이것이 나의 처음이 문제를 가지고 같이 아주 잃고 나는 성공적으로 내 시스템의 다른 에이전트 사이에 전에 유사한 통신을 구현 느낄

...

어떤 도움, 디버그 조언, 아이디어는 크게 감사하겠습니다!

+0

matchSender를 나가면? –

+0

어느 쪽도 작동하지 않는다, 나는 수신기 측에 전체 MessageTemplate를 제거하고 아직도 아무것도 얻지 않았다. 하지만 그 해결책을 찾았습니다! 아래에 게시했습니다. –

답변

2

내 시스템에서 거대한 디자인 실수로 인해 실제로 문제가 발생했습니다.

사실, 나는 동일한 performative와 동일한 발신자 (senderAgent)와 일치하는 MessageTemplate을 가진 메시지를 기다리는 2 개의 순환 행동 (targetAgent에서)을 가졌다. 그런 다음이 동작은 메시지의 구문 분석 된 내용을 기반으로 무언가를 수행할지 여부를 결정합니다. 이것은 바보 같고 매우 나쁜 디자인 이었기 때문에이 두 에이전트를 하나에 통합하고 컨텐츠와 관련된 조건을 추가하면 트릭을 만들었습니다.

"수신"방법에 대한 JADE 문서를 읽음으로써이를 발견했습니다. "에이전트의 메시지 대기열에서 메시지를 받고"있는 것을 보았을 때 모든 것이 명확 해졌습니다. 수신하려고 시도 할 때 대기열에 메시지가 없습니다. 동일한 에이전트의 다른 동작에 의해 확실히 수신되었습니다.

음, 케이스가 닫혔습니다.

+1

사실, 저는 다른 대화 ID를 사용하기 시작했습니다. 지금은 작동하고 있습니다. –