MaDKit forum

Welcome All !
Please, use explicit topic names when creating new threads. Thanks.

You are not logged in.

#1 2012-10-22 10:43:38

Baptiste
Member
Registered: 2012-10-12
Posts: 12

Debut des agents, methode Activate()

Bonjour,

Est il possible d'envoyer des messages lors de la création des agents tels que Broker/Provider/Client?

Car dans ma méthode Activate() , j'ai ceci

public void Activate ()
{
        requestRole("travel","travel-map","sendMessBroker",null);
   
        sendMessage("travel","travel-map","map", new ObjectMessage<String>(getName()+" up"));

}


Lors du lancement du marketOrg, seulement 2 des 3 brokers envoient un message (ou je ne recois que 2 des 3 messages)

Ce qui m’amène a me demander une autre question : y a-t-il un ordre des messages dans la 'boite au lettre' d'un agent?

Cordialement,

Leulliette Baptiste

Offline

#2 2012-10-23 11:35:36

fmichel
Administrator
From: Montpellier
Registered: 2009-03-24
Posts: 172
Website

Re: Debut des agents, methode Activate()

Bonjour,

Il est bien sûr possible d'envoyer des messages dans l'activate. Par contre, si ce n'est pas gérer dans l'ordre de lancement des agents, rien ne vous garantit que l'agent cible a bien déjà pris son rôle, ce qui n'est apparemment pas le cas pour l'agent qui doit recevoir les messages.
Une chose à savoir ici : par défaut launchAgent retourne lorsque l'agent lancé a fini son activate : cela peut par exemple aider à être sûr que les agents ont bien pris leurs rôles et qu'ils sont donc joignables.
Par ailleurs, les messages sont ordonnés dans la boîte par leur ordre de réception, celui pouvant être différent de l'ordre d'émission.

Offline

#3 2012-10-24 07:39:27

Baptiste
Member
Registered: 2012-10-12
Posts: 12

Re: Debut des agents, methode Activate()

Bonjour,

Merci pour la réponse. Je n'arrive pas a verifier qu'un agent a pris son role.
J'ai donc fait une vérification mais ca n'a pas l'air de marcher..

AgentAddress map = null;
        map = getAgentWithRole("travel","travel-map","map");
        //System.out.println(map);
        while (map == null)
        {
            map = getAgentWithRole("travel","travel-map","map");
        }
        sendMessage("travel","travel-map","map", new ObjectMessage<String>(getName()+" up"));


Qu'est ce qui ne va pas dans la logique pour savoir si l'agent prend son role?

Aussi, est il possible "d'intercepter" tout les messages qui transitent dans une communauté?


Cordialement,

Leulliette Baptiste

Offline

#4 2012-10-25 15:29:21

fmichel
Administrator
From: Montpellier
Registered: 2009-03-24
Posts: 172
Website

Re: Debut des agents, methode Activate()

Bonjour,

En fait si vous regardez la javadoc de getAgentWithRole, vous verrez que cette fonction n'inclue pas l'agent qui utilise cette méthode dans la recherche. Donc en fait, si vous voulez avoir l'agent inclu, il faut utiliser

public List<AgentAddress> getAgentsWithRole(String community,
                                            String group,
                                            String role,
                                            boolean callerIncluded)

avec callerIncluded à true, ainsi vous aurez tous les agents qui jouent ce rôle à l'instant t.

Offline

#5 2012-10-26 09:59:51

fmichel
Administrator
From: Montpellier
Registered: 2009-03-24
Posts: 172
Website

Re: Debut des agents, methode Activate()

J'oubliais,

2 choses :

Si cela concerne l'agent courant, il y a beaucoup plus simple pour savoir si il a bien pris le rôle : requestRole doit retourner SUCCESS. De plus, cette inforamtion est immédiatemeznt visible si on passe logLevel Level.ALL

Par ailleurs,

Aussi, est il possible "d'intercepter" tout les messages qui transitent dans une communauté?

Oui il faut envoyer un message de type AgentHookMessage à l'agent kernel, cf javadoc. En fait, vous allez grace à cela récupérer tous les messages échangés, à vous de les filtrer.

Offline

#6 2012-10-26 18:35:10

Baptiste
Member
Registered: 2012-10-12
Posts: 12

Re: Debut des agents, methode Activate()

Bonjour,

merci pour les réponses, cela me permet de mieux visualiser la facon de creer le graphe de facon generale (et non comme je l'avais commencer avec MarketOrg)


J'arrive donc a voir tout les messages. J'ai une derniere question : comment acceder a l'ObjectMessage qui se trouve dans le AgentHookMessage.

AgentHookMessage.46
                      content: {[Ljava.lang.Object;@6e6017e7}
                      command: SEND_MESSAGE {[ObjectMessage.45: 5@(travel,travel-clients,client) -> 9@(travel,travel-clients,broker)
                   content: {plane}]}

Recuperer le "5@(travel,travel-clients,client) -> 9@(travel,travel-clients,broker)" et ainsi travailler avec?

Last edited by Baptiste (2012-10-26 20:57:30)

Offline

#7 2012-10-28 14:30:23

fmichel
Administrator
From: Montpellier
Registered: 2009-03-24
Posts: 172
Website

Re: Debut des agents, methode Activate()

Bonjour,

Baptiste wrote:

comment acceder a l'ObjectMessage qui se trouve dans le AgentHookMessage.

AgentHookMessage.46
                      content: {[Ljava.lang.Object;@6e6017e7}
                      command: SEND_MESSAGE {[ObjectMessage.45: 5@(travel,travel-clients,client) -> 9@(travel,travel-clients,broker)
                   content: {plane}]}

Recuperer le "5@(travel,travel-clients,client) -> 9@(travel,travel-clients,broker)" et ainsi travailler avec?

Un AgentHookMessage est un ObjectMessage par héritage donc vous devriez en principe pouvoir utiliser la méthode getContent qui vous retournera le message échangé, et donc toutes les informations nécessaires.

Offline

#8 2012-10-28 17:28:03

Baptiste
Member
Registered: 2012-10-12
Posts: 12

Re: Debut des agents, methode Activate()

Je ne vois vraiment pas commencer acceder a l'interieur du HookMessage..

Message m = waitNextMessage();       
            ObjectMessage<String> res = (ObjectMessage<String>) m;
            System.out.println(res);

Ceci affiche le HookMessage dans son integralité

Message m = waitNextMessage();       
            ObjectMessage<String> res = (ObjectMessage<String>) m;
            System.out.println(res.getContent());

N'affiche plus rien.. (de meme pour le getContent().toString())

Last edited by Baptiste (2012-10-31 01:09:06)

Offline

#9 2012-10-31 12:18:19

fmichel
Administrator
From: Montpellier
Registered: 2009-03-24
Posts: 172
Website

Re: Debut des agents, methode Activate()

J'ai oublié un point important expliqué dans la javadoc. getContent renvoie un tableau d'objets. Ici le message est le seul et unique paramètre donc il faut utiliser getContent()[0] pour récupérer l'objet qui est lui un message.
Je vais faire évoluer l'api qpour que cela soit plus simple à utiliser. D'ici là vous devriez pouvoir vouis en sortir cette version.

Offline

#10 2012-10-31 18:51:14

Baptiste
Member
Registered: 2012-10-12
Posts: 12

Re: Debut des agents, methode Activate()

Bonjour,

Je ne vois pas exactement ce que vous voulez dire par getContent()[0]

Eclipse me dit que la méthode getContent() renvoie un String simple et non un tableau. Aurais-je un probleme avec la librairie Madkit?

Offline

#11 2012-11-01 10:49:33

fmichel
Administrator
From: Montpellier
Registered: 2009-03-24
Posts: 172
Website

Re: Debut des agents, methode Activate()

Baptiste wrote:

Je ne vois pas exactement ce que vous voulez dire par getContent()[0]

En fait il ne faut pas convertir le message en ObjectMessage<String> mais plus simplement en AgentHookMessage sinon vous forcez le type sur ObjectMessage<String> (qui est possible à cet endroit) avec votre cast et donc Eclipse pense que seule une String peut être récupérée.
donc

Message m = waitNextMessage();       
if(m instanceof AgentHookMessage){
         AgentHookMessage h = (AgentHookMessage) m;
         Message messageEchange = h.getContent()[0];// getContent renvoyant un tableau, on peut utiliser directement les [] dessus
}

Offline

#12 2012-11-01 16:12:17

Baptiste
Member
Registered: 2012-10-12
Posts: 12

Re: Debut des agents, methode Activate()

Ok, tout marche correctement maintenant merci

J'ai une autre question : Si on lance (par exemple), le market org, et que d'un autre cote, on lance le graphe, (Donc les 2 fichiers java on leur propre main). Est ce que lors du hook message, il va recuperer les messages des agents du market org??

Aussi, comment savoir quand un agent meurt? Je suppose que l'on utilise toujours un agentHookMessage de ce type


sendMessage(LocalCommunity.NAME, LocalCommunity.Groups.SYSTEM,
				Organization.GROUP_MANAGER_ROLE, new AgentHookMessage(
						AgentAction.KILL_AGENT));

Cependant, je ne recois que des GUIMessage avec comme content : Client X Activated (avec X = un nombre)
Jamais vu de message informant la mort d'un agent

Last edited by Baptiste (2012-11-02 01:14:47)

Offline

#13 2012-11-05 12:39:05

fmichel
Administrator
From: Montpellier
Registered: 2009-03-24
Posts: 172
Website

Re: Debut des agents, methode Activate()

Baptiste wrote:

Ok, tout marche correctement maintenant merci

J'ai une autre question : Si on lance (par exemple), le market org, et que d'un autre cote, on lance le graphe, (Donc les 2 fichiers java on leur propre main). Est ce que lors du hook message, il va recuperer les messages des agents du market org??

Non, chaque lancement va lancer un nouveau noyau séparé. Donc à moins de les connecter cela ne marchera pas. Il faut que l'agent qui fait les graphes soit lancé sur le même noyau. Ceci dit, il sera intéressant de travailler sur une version distribuée : il faut juste que l'agent noyau soit joignable depuis un autre noyau, ce qui n'est pas le cas actuellement car son rôle est local (i.e. le groupe local n'est pas distribué).

Baptiste wrote:

Aussi, comment savoir quand un agent meurt? Je suppose que l'on utilise toujours un agentHookMessage de ce type


sendMessage(LocalCommunity.NAME, LocalCommunity.Groups.SYSTEM,
				Organization.GROUP_MANAGER_ROLE, new AgentHookMessage(
						AgentAction.KILL_AGENT));

Cependant, je ne recois que des GUIMessage avec comme content : Client X Activated (avec X = un nombre)
Jamais vu de message informant la mort d'un agent

Rien de précis n'est prévu pour l'instant à ce niveau là. Ce que vous récupérez est du à la généricité de l'agent action. Il faut que je travaille sur ce type d'événements... dès que j'ai le temps.

Offline

#14 2012-11-17 20:17:16

Baptiste
Member
Registered: 2012-10-12
Posts: 12

Re: Debut des agents, methode Activate()

Bonjour,

Le graphe Organisationnel est quasiment fini. Cependant, j'ai un problème de logique. Le graphe n'accepte pas d'avoir des noeuds différents avec le même nom, cependant, du coté de Madkit, il est possible d'avoir des mêmes rôles dans des groupes différents. De ce fait, certains rôles passent a la trappe..

Que faire dans ce cas?

Offline

#15 2012-11-19 10:49:07

fmichel
Administrator
From: Montpellier
Registered: 2009-03-24
Posts: 172
Website

Re: Debut des agents, methode Activate()

Bonjour,

Une solution simple consiste à nommer les noeuds plus précisément avec un séparateur : par exemple un groupe communaute@unGroupe, un rôle : c76@g3@unRole, etc. Chaque nom est alors unique.

Offline

#16 2012-11-26 09:14:52

romain8409
Member
Registered: 2012-10-03
Posts: 2

Re: Debut des agents, methode Activate()

Bonjour,

La version 19 ne reconnait pas les Hookmessages. Est-ce un bug?

Offline

#17 2012-11-26 09:46:50

fmichel
Administrator
From: Montpellier
Registered: 2009-03-24
Posts: 172
Website

Re: Debut des agents, methode Activate()

Bonjour,

Êtes-vous sûrs d'utiliser la classe madkit.message.hook.HookMessage ?
Voius pouvez aussi faire un project -> clean sous Eclipse.
Quel est le message d'erreur ?

Offline

#18 2012-11-26 19:14:23

Baptiste
Member
Registered: 2012-10-12
Posts: 12

Re: Debut des agents, methode Activate()

Bonjour,

Nous avons juste remplacé le .jar 18 par le .jar 19. Maintenant nous avons une erreur pour chaque ligne de type AgentHookMessage (AgentHookMessage cannot be resolved to a type)

Proposition de solution par eclipse : Creer une classe AgentHookMessage

Offline

#19 2012-11-26 22:03:24

fmichel
Administrator
From: Montpellier
Registered: 2009-03-24
Posts: 172
Website

Re: Debut des agents, methode Activate()

Le nom de la classe a changé : AgentHookMessage -> HookMessage. Utilisez source -> organize imports pour faire les changements d'un seul coup.

Offline

#20 2012-11-26 23:03:06

Baptiste
Member
Registered: 2012-10-12
Posts: 12

Re: Debut des agents, methode Activate()

Bonjour,

A quoi correspond le 'infos' du nouveau constructeur HookMessage? J'arrive pas trop à comprendre l'API en rapport avec le second argument ..

Offline

#21 2012-11-28 09:53:28

fmichel
Administrator
From: Montpellier
Registered: 2009-03-24
Posts: 172
Website

Re: Debut des agents, methode Activate()

Bonjour,

le second argument sera surtout utiliser dans les sous classes pour transmettre les infos sur l'événement. Vous pouvez l'ignorer pour créer un hook car c'est un argument à taille variable (donc potentiellement nulle), i.e. new HookMessage(AgentActionEvent.CREATE_GROUP); est valide

Offline

#22 2012-12-05 08:55:43

romain8409
Member
Registered: 2012-10-03
Posts: 2

Re: Debut des agents, methode Activate()

Bonjour,

Le graphe organisationnel est fini. Nous attaquons la frame

Comment accéder à la frame qui est auutomatiquement créée par l'agent? Est-ce que c'est la méthode "setupFrame"? Car nous ne comprennons pas comment fonctionne la fenêtre avec les tutoriels et comme nous n'avons pas encore fait le cour sur les interfaces graphiques.

Offline

#23 2012-12-05 13:25:31

fmichel
Administrator
From: Montpellier
Registered: 2009-03-24
Posts: 172
Website

Re: Debut des agents, methode Activate()

romain8409 wrote:

Est-ce que c'est la méthode "setupFrame"? Car nous ne comprennons pas comment fonctionne la fenêtre avec les tutoriels et comme nous n'avons pas encore fait le cour sur les interfaces graphiques.

oui c'est via la méthode setupFrame. Pour les interfaces graphiques, vous pouvez jeter un coup d'oeil sur mon cours : ici

Offline

#24 2012-12-19 08:13:41

Baptiste
Member
Registered: 2012-10-12
Posts: 12

Re: Debut des agents, methode Activate()

Bonjour,

Nous avons des problèmes à propos avec le madkit 20

Exception in thread "main" java.lang.VerifyError: class scala.runtime.RichInt$$anon$1 overrides final method foreach$mVc$sp.(Lscala/Function1;)V

Offline

#25 2013-01-09 09:56:17

Baptiste
Member
Registered: 2012-10-12
Posts: 12

Re: Debut des agents, methode Activate()

Bonjour,

J'ai une question pour la rédaction du Rapport: Lors de la mort d'un agent, on recupere la String 5@-576386398 (par exemple). A quoi correspond ce qu'il y a apres le @?

Offline

Board footer