JADE : création / destruction Agents

JADE : création / destruction Agents - Java - Programmation

Marsh Posté le 07-05-2015 à 11:29:22    

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
Reply

Marsh Posté le 07-05-2015 à 11:29:22   

Reply

Marsh Posté le 22-01-2016 à 15:58:28    

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
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed