Контейнеры с нефритовым агентом

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


person beyerss    schedule 03.02.2009    source источник
comment
Это старый вопрос, но для тех, кто ищет, есть более новый аналогичный вопрос, принятый ответ на который ориентирован на получение контейнеров в качестве постоянной службы: stackoverflow.com/questions/9094522/   -  person edmundo096    schedule 21.10.2015


Ответы (1)


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

Чтобы получить снимок идентификаторов доступных в данный момент контейнеров агентов, отправьте сообщение запроса в службу управления агентами (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, создайте Behavior, расширяющий 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());
}

Надеюсь это поможет,

Расс

person DoctorRuss    schedule 10.12.2009
comment
в новой версии JADE есть ли другой способ, кроме связи с AMS? - person Purushottam; 01.02.2012
comment
AMS предназначена для предоставления агентам доступа к информации на уровне системы: она предназначена именно для этой работы! Вы можете написать службу ядра для выполнения аналогичной работы, но по опыту они действительно очень сложны. - person DoctorRuss; 08.02.2012