2009-02-03 8 views
4

Может ли кто-нибудь сказать мне, как найти доступные контейнеры-контейнеры через код Java? Я использую структуру агента JADE, и я выяснил, как создавать новые контейнеры, но не найти существующие контейнеры (чтобы агенты могли быть развернуты в них).Контейнеры контейнеров нефрита

+0

Это старый вопрос, но для тех, кто поиск более нового аналогичного вопроса, в котором принятый ответ сосредоточен на получении Контейнеров как «текущей службы»: http://stackoverflow.com/questions/9094522/getting-a-list-of-all-jade-containers – edmundo096

ответ

5

Существует два способа сделать это, в зависимости от того, хотите ли вы получать информацию через текущую службу или текущий моментальный снимок в сообщении.

Чтобы получить снимок идентификаторов доступных контейнеров агентов, отправьте сообщение с запросом в службу управления агентами (AMS) и дождитесь его ответа. Использование управления Онтология JADE и термин QueryPlatformLocationsAction, отправитель и методы будут:

private void queryAMS() throws CodecException, OntologyException { 
    QueryPlatformLocationsAction query = new QueryPlatformLocationsAction(); 
    Action action = new Action(myAgent.getAID(), query); 

    ACLMessage message = new ACLMessage(ACLMessage.REQUEST); 
    message.addReceiver(myAgent.getAMS()); 
    message.setLanguage(FIPANames.ContentLanguage.FIPA_SL); 
    message.setOntology(JADEManagementOntology.getInstance().getName()); 
    myAgent.getContentManager().fillContent(message, action); 
    myAgent.send(message); 
} 
private void listenForAMSReply() throws UngroundedException, CodecException, 
OntologyException { 
    ACLMessage receivedMessage = myAgent.blockingReceive(MessageTemplate 
      .MatchSender(myAgent.getAMS())); 
    ContentElement content = myAgent.getContentManager().extractContent(
     receivedMessage); 

    // received message is a Result object, whose Value field is a List of 
    // ContainerIDs 
    Result result = (Result) content; 
    List listOfPlatforms = (List) result.getValue(); 

    // use it 
    Iterator iter = listOfPlatforms.iterator(); 
    while (iter.hasNext()) { 
     ContainerID next = (ContainerID) iter.next(); 
     System.out.println(next.getID()); 
    } 
} 

Чтобы получить эту информацию в качестве постоянной службы, и получить ContainerID каждого контейнера, как он регистрирует с AMS , создайте поведение, которое расширяет AMSSubscriber. Зарегистрировать обработчик события AddedContainer, и вы сможете получить доступ к ContainerID вновь доступного контейнера:

public class AMSListenerBehaviour extends AMSSubscriber { 
@Override 
public void installHandlers(Map handlersTable) { 
    handlersTable.put(AddedContainer.NAME, addedContainerHandler); 
} 

public final class AddedContainerHandler implements EventHandler { 
@Override 
public void handle(Event ev) { 
    AddedContainer event = (AddedContainer) ev; 
    ContainerID addedContainer = event.getContainer(); 
    System.out.println(addedContainer.getID()); 
} 

Надежда это помогает,

Russ

+0

в более новый JADE есть ли другой способ, чем общаться с AMS? – Purushottam

+0

AMS позволяет агентам получать доступ к информации о системном уровне: он предназначен именно для этой работы! Вы можете написать Службу ядра, чтобы выполнить аналогичную работу, но по опыту они очень сложны. – DoctorRuss