Может ли кто-нибудь сказать мне, как найти доступные контейнеры-контейнеры через код Java? Я использую структуру агента JADE, и я выяснил, как создавать новые контейнеры, но не найти существующие контейнеры (чтобы агенты могли быть развернуты в них).Контейнеры контейнеров нефрита
ответ
Существует два способа сделать это, в зависимости от того, хотите ли вы получать информацию через текущую службу или текущий моментальный снимок в сообщении.
Чтобы получить снимок идентификаторов доступных контейнеров агентов, отправьте сообщение с запросом в службу управления агентами (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
в более новый JADE есть ли другой способ, чем общаться с AMS? – Purushottam
AMS позволяет агентам получать доступ к информации о системном уровне: он предназначен именно для этой работы! Вы можете написать Службу ядра, чтобы выполнить аналогичную работу, но по опыту они очень сложны. – DoctorRuss
Это старый вопрос, но для тех, кто поиск более нового аналогичного вопроса, в котором принятый ответ сосредоточен на получении Контейнеров как «текущей службы»: http://stackoverflow.com/questions/9094522/getting-a-list-of-all-jade-containers – edmundo096