Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1696 connectés 

  FORUM HardWare.fr
  Programmation
  Java

  JADE : création / destruction Agents

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

JADE : création / destruction Agents

n°2257557
DarkHorse
Posté le 07-05-2015 à 11:29:22  profilanswer
 

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 :
  1. // Get a hold on JADE runtime
  2.     Runtime rt = Runtime.instance();
  3.     // Create a default profile
  4.     ProfileImpl p = new ProfileImpl();
  5.     // set the profile to be non-main container
  6.     p.setParameter(Profile.MAIN, "false" );
  7.     try {
  8. // Create a new non-main container, connecting to the default
  9. // main container (i.e. on this host, port 1099)
  10. AgentContainer ac = rt.createAgentContainer(p);
  11. // create a new agent
  12. jade.wrapper.Agent t1 = (jade.wrapper.Agent) ac.createNewAgent(t1AgentName,getClass().getName(),new Object[0]);
  13. // fire-up the agent
  14. t1.start();
  15. System.out.println(getLocalName()+" CREATED AND STARTED NEW THANKSAGENT:"+t1AgentName);
  16. // create a new agent
  17. jade.wrapper.Agent t2 = (jade.wrapper.Agent) ac.createNewAgent(t2AgentName,getClass().getName(),new Object[0]);
  18. // fire-up the agent
  19. t2.start();
  20. System.out.println(getLocalName()+" CREATED AND STARTED NEW THANKSAGENT:"+t2AgentName);
  21.     } catch (Exception e2) {
  22. e2.printStackTrace();
  23.     }


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 :
  1. jade.domain.JADEAgentManagement.KillAgent ka = new
  2. jade.domain.JADEAgentManagement.KillAgent();
  3.         AID kaid = new AID("newContAgent at X.X.X.X:1099/JADE", AID.ISGUID);
  4.         kaid.addAddresses("http://X.X.X.X:7778/acc" );
  5.        
  6.         ka.setAgent(kaid);
  7.         jade.content.onto.basic.Action kaction = new
  8. jade.content.onto.basic.Action();
  9.         kaction.setActor(getAMS());
  10.         kaction.setAction(ka);
  11.         ACLMessage AMSRequest = new ACLMessage(ACLMessage.REQUEST);
  12.         AMSRequest.setSender(getAID());
  13.         AMSRequest.clearAllReceiver();
  14.         AMSRequest.addReceiver(getAMS());
  15. AMSRequest.setProtocol(FIPANames.InteractionProtocol.FIPA_REQUEST);
  16.       AMSRequest.setLanguage(FIPANames.ContentLanguage.FIPA_SL0);
  17.  
  18. AMSRequest.setOntology(jade.domain.JADEAgentManagement.JADEManagementOntology.NAME);
  19.       getContentManager().fillContent(AMSRequest, kaction);
  20.       send(AMSRequest);
  21.     }
  22.     catch(Exception fe) {
  23.       fe.printStackTrace();
  24.     }
  25. Then in the setup():
  26. //Register the SL content language
  27. getContentManager().registerLanguage(new jade.content.lang.sl.SLCodec(),
  28. FIPANames.ContentLanguage.FIPA_SL0);
  29. //Register the mobility ontology
  30. getContentManager().registerOntology(jade.domain.JADEAgentManagement.JADEManagementOntology.getInstance());


Source: ici  
 
Cependant ça me met une belle erreur au niveau de la ligne

Code :
  1. Register the mobility ontology
  2. getContentManager().registerOntology(jade.domain.JADEAgentManagement.JADEManagementOntology.getInstance());


Comme quoi il ne connait pas l'ontologie en question  :??:  

Code :
  1. jade.content.onto.OntologyException: Unknown ontology JADE-Agent-Management


Solution; j'avais essayé plusieurs méthodes et celle ci fonctionne  :jap:  
 
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 :
  1. 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
mood
Publicité
Posté le 07-05-2015 à 11:29:22  profilanswer
 

n°2274112
DarkHorse
Posté le 22-01-2016 à 15:58:28  profilanswer
 

Ah tiens je retrouve mon topic, ça fait longtemps  :jap:  
 
Bon finalement pour tuer un agent il faut bien passer par l'agent AMS:
 

Code :
  1. // Kills the specified agent in platform
  2. void killAgent(String agentName){
  3.  // Create action
  4.  KillAgent ka = new KillAgent();
  5.  AID kaid = new AID(agentName, AID.ISLOCALNAME);
  6.  ka.setAgent(kaid);
  7.  Action kaction = new Action();
  8.  kaction.setActor(getAMS());
  9.  kaction.setAction(ka);
  10.  // Send message to AMS
  11.  try {
  12.   ACLMessage AMSRequest = new ACLMessage(ACLMessage.REQUEST);
  13.   AMSRequest.setSender(getAID());
  14.   AMSRequest.clearAllReceiver();
  15.   AMSRequest.addReceiver(getAMS());
  16.   AMSRequest.setProtocol(FIPANames.InteractionProtocol.FIPA_REQUEST);
  17.   AMSRequest.setLanguage(FIPANames.ContentLanguage.FIPA_SL0);
  18.   AMSRequest.setOntology(JADEManagementOntology.NAME);
  19.   getContentManager().fillContent(AMSRequest, kaction);
  20.   send(AMSRequest);
  21.  } catch (CodecException | OntologyException e) {
  22.   // TODO Auto-generated catch block
  23.   e.printStackTrace();
  24.  }
  25. }


Ensuite, la méthode TakeDown() de l'agent qu'on souhaite tuer est appelée. Dans cette méthode il faut dés-enregistrer l'agent du DF:
 

Code :
  1. // Agent clean-up operations when terminated
  2. protected void takeDown(){
  3.  try {
  4.   DFService.deregister(this);
  5.  } catch (Exception e) {
  6.   e.printStackTrace();
  7.  }
  8.  System.out.println(getLocalName() + ": Terminated" );
  9. }


Message édité par DarkHorse le 22-01-2016 à 15:59:07

---------------
Corvette C5 Coupé owner

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Java

  JADE : création / destruction Agents

 

Sujets relatifs
Création d'un espace membre (sur wp)Création d'un application, cherche des employées
Création ScriptCréation avec choix prioritaire et 2ème choix dans Google Forms
Difficultés création de graphique croisé dynamique VBA[Divers] Conseil création site web
création d'un bouton parcourircréation d'un bouton parcourir
Création d'un site.Creation d'adresses email en masse
Plus de sujets relatifs à : JADE : création / destruction Agents


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR