2014-05-12 17 views
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的循環行爲似乎總是得到「null」消息(又名「無消息」)。

我使用Jade Console的Sniffer和Introspector工具進行調查。

  • 嗅探器顯示消息從senderAgent有效地發送到targetAgent。
  • Introspector甚至顯示消息在發送方發送並在目標端接收。

內容是正常的,AIDs是正常的,那麼爲什麼targetAgent的週期性接收行爲從來沒有捕捉到任何東西?

我覺得很迷失,因爲這是我有這個問題第一次和我之前成功地實施我的系統的其他代理之間的類似通信...

任何幫助,調試技巧或想法,將不勝感激!

+0

如果你離開matchSender出? –

+0

也不工作,我擺脫了接收端的整個MessageTemplate,仍然沒有。但我找到了解決方案!在下面發表。 –

回答

2

好吧,所以我的問題實際上來自我的系統中的一個巨大的設計錯誤。

事實上,我有兩個循環行爲(在targetAgent中)等待消息的MessageTemplate匹配相同的執行和相同的發送者(senderAgent)。然後,這些行爲都會根據解析的消息內容決定是否做某件事。由於這是愚蠢而且非常糟糕的設計,將這兩個代理融合爲一體並添加內容相關條件成爲了訣竅。

我通過閱讀「接收」方法的JADE文檔發現了這一點。當我看到它「在代理的消息隊列中收到消息」時,一切都變得清晰:當我嘗試接收消息時,隊列中沒有消息,它已經被同一代理的另一行爲所接收。

那麼,案件關閉!

+1

事實上,我開始使用不同的會話ID,現在工作起來很麻煩。 –