Le descripteur AgentUDescriptor

La capacités dont dispose un agent, c’est à dire l’ensemble des traitements qu’il peut déclencher, lui sont principalement données par son descripteur interne. Ce descripteur interne est un objet défini par l’interface AgentUDescriptor (package: skuad.agentu) que le système SKUAD crée spécifiquement pour chaque agent instancié.

Comme nous l’avons vu dans le tutoriel Manipulation des agents/Ecrire le code d’un agent ce descripteur est transmis à l’agent en premier argument de chacune des méthodes de l’interface AgentU. De cette façon, on s’assure que ce descripteur soit disponible dans chacun des espaces de code de l’agent.

L’interface AgentUDescriptor  présente les méthodes suivantes :

//1) Consulter les informations de l’agent
public int id(); //identifiant de l'agent
public String getName(); //nom affecté à l'agent
public String typeAgent(); //type de l'agent
public int state(); //état courant de l'agent
public int runMode(); //mode d'exécution de l'agent

//2) message de log
ublic void log(String mess);

//3) Rythme du comportement
public Pulse pulse(String label, long delay, boolean fire_uptodate); //pulse ponctuel
public Pulse loopPulse(String label, long delay, long periode, boolean reset_on_resume); //pulse périodique

//4) Gestion des slots sociaux
public Avatar getAvatar(String slot_name);
public String socialSlot(Avatar a);
public boolean isSocialPlugged(String slot_name);
public Iterable socialsSpecif();

//5) Gestion des slots physiques
public Device getDevice(String slot_name);
public void readSensor(String query_label, SensorTarget[] targets);
public String physicalSlot(Device d);
public boolean isPhysicalPlugged(String slot_name);
public Iterable physicalsSpecif();
public boolean isReady(String slot);
public int trueType(String slot);

Il y a donc globalement 5 groupes de méthodes disponibles dans cette interface. Dans ce tutoriel nous allons nous limiter au deux premiers groupes, et nous verrons plus en détails les 3 groupes suivants dans les 3 prochains tutoriels.

Le premier groupe est constitué de méthode permettant d’obtenir des informations sur l’agent:

  • son identité : l’identifiant interne qui lui a été attribué par le système (int id()), et le nom sous lequel il a été enregistré (String getName()).
  • son type : il s’agit du nom sous lequel la classe classe qui définie le code source de l’agent a été enregistré auprès du serveur agent (String typeAgent()), par défaut ce nom correspond au nom de cette classe mais on peut choisir de faire autrement.
  • l’état courant de l’agent : cet état correspond aux valeurs AgentU.OFF, AgentU.RUN, AgentU.PAUSE et AgentU.NOT_EXIST qui indique si l’agent est à l’arrêt, en cours d’exécution, en pause ou s’il n’est plus connu du système.
  • son mode d’exécution : qui renseigne sur le mode d’exécution de l’agent. Ce mode pour avoir les valeurs : AgentU.MANUAL (par défaut), AgentU.ALLWAYS_RUN, AgentU.BREAKPLUG_STOP ou AgentU.BREAK_PLUG_PAUSE. Nous verrons prochainement comment changer ce mode et comment cela impacte l’exécution de l’agent.

Le second groupe se compose d’une unique méthode : void log(String mess). Cette méthode permet à l’agent d’émettre un message textuel d’information interne, qui correspond à ce qu’on appelle communément en informatique « un message log ». Un tel message s’apparente à ceux que nous avons produits dans les précédents tutoriels avec la fonction System.out.println(…). Mais la différence ici est qu’avec la méthode log(…) du descripteur de l’agent, le message n’est pas transmis sur l’affichage de la console, mais plutôt à la couche logicielle qui supporte l’exécution de l’agent (dont le représentant visible est l’objet ServerAU). Cette différence de fonctionnement entre un System.out.println(…) et la méthode void log(String mess) du descripteur de l’agent est importante, car en situation réel les agents seront le plus sauvant exécuté sur des machines qui ne seront pas relié à des écrans. Aussi, dans ces situations, personne ne sera en mesure de prendre connaissance du message produit par un appel System.out.println(…). Alors qu’avec la méthode void log(String mess) le message est émis dans le contexte d’activité de l’agent, et le flux d’information que constitue les appels de ce type peut être observé (même à distance). Par exemple, on peut opérer cette observation avec un objet AgentLogger comme nous avons appris à utiliser dans le tutoriel Manipulation de base des agents/Surveiller l’activité des agents.

Mise en pratique :

Utilisez cette connaissance sur le descripteur des agents que vous venez d’avoir pour concevoir une nouvelle classe agent de nom MyAgentHelloBye2. Cette classe sera similaire à celle que vous avez produite dans le tutoriel Manipulation de base des agents/Ecrire le code d’un agent à la différence qu’elle sera plus conforme avec le modèle d’agent AgentHelloBye qu’on a essayé de reproduire.

Donc pour cela, vous devez faire en sorte que les messages produits par l’agent soit émis via la méthode log(…) de son descripteur, plutôt qu’avec la fonction System.out.println(…). Veillez aussi à modifier chacun des messages afin d’ajouter à leur contenu le nom de l’agent, exactement comme le font les agents de type AgentHelloBye.

Créez ensuite programme qui lance l’exécution d’agent MyAgentHelloBye2, et ajoutez les instructions nécessaires pour monitorer son activité (voir Manipulation de base des agents/Suveiller l’activité des agents).

Lancez l’exécution de ce programme et vérifiez que les informations qui s’affichent dans la console sont conformes à ce que nous voulons.

A vous de jouer !

Une fois que vous avez réussi à écrire ce programme, ou si vous n’y parvenez pas, vous pouvez comparez votre code à la proposition de solution ci-dessous.

afficher la solution