Bonjour à vous,
Comme j'ai pu le constater Jade n'est pas vraiment la tasse de thé sur ce forum (4 réponses en utilisant l'outil de recherche et le dernier datant de 2010).
Je me lance donc dans ma question, sans grand espoir de réponse.. (Malgré tout si la communauté JADE existe sur HFR je serai content de faire un Topic Unique à ce sujet)
Alors mon problème est assez "simple":
J'ai un SMA (Système Multi Agent) sous JADE comportant un dizaine d'agents, dont un qui surveille l'état des autres. Pour cela les agents lui envoient régulièrement des petits messages ACL pour lui dire qu'ils vont toujours bien.
Sauf que lorsqu'un agent ne répond plus (mal programmé, boucle infini ou planté, peu importe la raison) il n'envoie plus ce message. Au bout d'un certain temps de messages non-envoyés, l'agent qui surveille doit tuer l'agent qui ne répond plus et le relancer.
Pour relancer l'agent 'normalement' j'ai trouvé l'astuce de comment faire:
Code :
- // Get a hold on JADE runtime
- Runtime rt = Runtime.instance();
- // Create a default profile
- ProfileImpl p = new ProfileImpl();
- // set the profile to be non-main container
- p.setParameter(Profile.MAIN, "false" );
- try {
- // Create a new non-main container, connecting to the default
- // main container (i.e. on this host, port 1099)
- AgentContainer ac = rt.createAgentContainer(p);
- // create a new agent
- jade.wrapper.Agent t1 = (jade.wrapper.Agent) ac.createNewAgent(t1AgentName,getClass().getName(),new Object[0]);
- // fire-up the agent
- t1.start();
- System.out.println(getLocalName()+" CREATED AND STARTED NEW THANKSAGENT:"+t1AgentName);
- // create a new agent
- jade.wrapper.Agent t2 = (jade.wrapper.Agent) ac.createNewAgent(t2AgentName,getClass().getName(),new Object[0]);
- // fire-up the agent
- t2.start();
- System.out.println(getLocalName()+" CREATED AND STARTED NEW THANKSAGENT:"+t2AgentName);
- } catch (Exception e2) {
- e2.printStackTrace();
- }
|
Inspiré de l'agent ThanksAgent qu'on peut trouver ici
Je n'ai pas pu le tester encore puisque j'ai pas réussi à tuer l'agent en question
Pour la destruction j'ai appris qu'il faut envoyer un message à l'agent AMS (le conteneur):
Code :
- jade.domain.JADEAgentManagement.KillAgent ka = new
- jade.domain.JADEAgentManagement.KillAgent();
- AID kaid = new AID("newContAgent at X.X.X.X:1099/JADE", AID.ISGUID);
- kaid.addAddresses("http://X.X.X.X:7778/acc" );
-
- ka.setAgent(kaid);
- jade.content.onto.basic.Action kaction = new
- jade.content.onto.basic.Action();
- kaction.setActor(getAMS());
- kaction.setAction(ka);
- ACLMessage AMSRequest = new ACLMessage(ACLMessage.REQUEST);
- AMSRequest.setSender(getAID());
- AMSRequest.clearAllReceiver();
- AMSRequest.addReceiver(getAMS());
- AMSRequest.setProtocol(FIPANames.InteractionProtocol.FIPA_REQUEST);
- AMSRequest.setLanguage(FIPANames.ContentLanguage.FIPA_SL0);
-
- AMSRequest.setOntology(jade.domain.JADEAgentManagement.JADEManagementOntology.NAME);
- getContentManager().fillContent(AMSRequest, kaction);
- send(AMSRequest);
- }
- catch(Exception fe) {
- fe.printStackTrace();
- }
- Then in the setup():
- //Register the SL content language
- getContentManager().registerLanguage(new jade.content.lang.sl.SLCodec(),
- FIPANames.ContentLanguage.FIPA_SL0);
- //Register the mobility ontology
- getContentManager().registerOntology(jade.domain.JADEAgentManagement.JADEManagementOntology.getInstance());
|
Source: ici
Cependant ça me met une belle erreur au niveau de la ligne
Code :
- Register the mobility ontology
- getContentManager().registerOntology(jade.domain.JADEAgentManagement.JADEManagementOntology.getInstance());
|
Comme quoi il ne connait pas l'ontologie en question
Code :
- jade.content.onto.OntologyException: Unknown ontology JADE-Agent-Management
|
Solution; j'avais essayé plusieurs méthodes et celle ci fonctionne
Vous avez des idées?
EDIT:
Mise à jour:
Finalement j'arrive à bien tuer un agent distant. Cependant je pensais qu'il serait automatiquement enlevé du registre de l'agent DF (Directory Facilitator: Pages Jaunes) mais non. D'après mes lectures lorsqu'un agent meurt la méthode TakeDown() était appelé mais ce n'est pas le cas à priori.
Cependant pour redémarrer l'agent, j'ai une belle erreur m'indiquant que l'agent ne peut pas être instancié:
Code :
- jade.wrapper.StaleProxyException: Class com.example.agents.nom_agent_tueur$2 for agent ( agent-identifier :name nom_agent_tué@localhost:1099/JADE ) cannot be instanciated - Caused by: com.example.agents.nom_agent_tueur$2
|
Je teste avec une deuxième solution venant d' ici mais Eclipse me retourne une erreur comme quoi il ne connait pas getContainerIDs
Message édité par DarkHorse le 22-01-2016 à 15:59:35
---------------
Corvette C5 Coupé owner