Я не уверен, что это то, что вы пытаетесь достичь. Кто является конечным реципиентом ACLMessage, который вы отправляете от агента JADE? все ли агенты, которые находятся в целевом контейнере?
Просто для уточнения, контейнер, по существу, адрес, где агенты могут находиться, это не entitiy в себя, что может отправлять и получать сообщения. В рамках JADE агенты имеют «Inbox» для ACLMessages, в основном объект BlockingQueue, содержащий список полученных сообщений. агент может наблюдать собственный список и обрабатывать их по мере продолжения жизненного цикла. Контейнеры не обладают этой способностью.
ACLMessages могут быть направлены на конкретных агентов путем добавления receipients и другие детали. Агент, который ПОЛУЧАТЬ сообщения могут прослушивать определенный ACLMessages пути использования MessageTemplate
, где можно конкретно выбирать сообщения из агента «Входящих» на основе критериев соответствия, например:
Messagetemplate mt = MessageTemplate.MatchPerformative(ACLMessage.INFORM);
ACLMessage msg = myAgent.receive(mt);
позволит агенту взять следующее сообщение ACLMessage.INFORM из его 'inbox'.
для дальнейших способностей, я предлагаю вам пройти через нефрит API.
Кроме того, для того, что я верю, что вы пытаетесь достичь, который послать сообщение всем агентам внутри контейнера. Вы можете запросить агент AMS для списка агентов, которые находятся на платформе, а затем отфильтровать их на ContainerID
. здесь какой-то код, чтобы вы начали:
AMSAgentDescription[] agents = null;
SearchConstraints sc = new SearchConstraints();
// if multiple searchs are done, isolate them based on the name of searching agent
sc.setSearchId(getAID().getName());
sc.setMaxResults(new Long(-1)); // long value of -1 means get all agents
agents = AMSService.search(this, new AMSAgentDescription(), sc); //Query AMS agent for available agents
Этот код будет получить список всех доступных агентов на платформе, которые регистрируются с агентом AMS. Удачи и поста, если у вас возникли проблемы :)