[JADE] Interaction Agent->Objet (classe POJO)
Bonjour,
Débutant en JADE, j'ai réussi dans un premier temps à faire communiquer des agents entre eux et aussi d'envoyer des données d'un objet simple à un agent en utilisant la méthode putO2AObject() de la classe AgentController.
Code:
1 2 3
| AgentController myAgentController = myContainer.getAgent("Test");
Person p1 = new Person("Person1", 0);
myAgentController.putO2AObject(p1, false); |
Ma question concerne l'opération inverse, c'est à dire comment je puisse envoyer des données d'un agent vers un object (qui n'est pas un agent) ?. Autrement-dit, je veux que mon agent me retourne un résultat à la fin de son traitement ?.
Je suis vraiment bloqué et j'ai besoin de votre aide !.
Merci à vous.
meme op mais dans le sens inverse
Il te suffit simplement de faire la même operation mais en sens inverse avec des interfaces, je m'explique:
-Tu crée une interface e.g
Code:
1 2
| public interface FaireTraitement{
<div style="margin-left:40px">public int faireQlqChose(String msg);</div>} |
et ton agent doit implémenter cette interface, activer le service O2A et enfin renvoyer l'implémentation:
Code:
1 2 3 4 5 6 7 8 9 10 11 12
| public class MonAgent extends Agent implements FaireTraitement{
public MonAgent(){
<div style="margin-left:40px">
setEnbaledO2ACommunication(true,10);
registerO2AInterface(this,this);</div>}
public int faireQlqChose (String msg){//envoyer un msg a un autre agent par example...
return resultat;
}
} |
finalement pour le récupérer et l'utiliser c'est tout simple,
Code:
1 2 3
| AgentController agent=container.createNewAgent (nom,MonAgent.class.toString(),null);
FaireTraitement sender=agent.getO2AInteface(FaireTraitement.class);
int resultat = sender.faireQlqChose("envoie message"); |
le seul hic ici est que la création de l'agent se fait en asynchrone, de ce fait tu risque parfois d’essayer de récupérer l’interface avant même que l'agent est été créer et donc la fonction te retournera null, solution possible, créer une mini class d'alerte comme ceci:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| public class Latch{
private boolean ready=false;
synchronized public void waitOn(){
try{
while (!ready){
wait();
}
}catch (Exception e){e.printStackTrace();}
}
synchronized public void ready(){
ready=true;
notifyAll();
}
}//fin de la class |
pour l'utiliser voila comment faire:
Code:
1 2 3 4
| Latch latch=new Latch();
AgentController agent=container.createNewAgent(nom,MonAgent.class.toString().new Object[]{latch});
latch.waitOn();
FaireTraitement traiter=agent.getO2AInterface(FaireTraitement.class); |
ainsi tu envoi le latch a ton agent, et lorsqu'il est prêt il t'informe pour que le processus principal puisse reprendre, comme sa:
Code:
1 2 3 4 5 6 7 8 9
| public class MonAgent ... {
...
public MonAgent(){
Object[] argument = getArguments();
setEnbaledO2ACommunication(true,10);
registerO2AInterface(this,this);
((Latch)argument[0]).ready();
}
.... |
voila en gros.. :D