Architektury usług internetowych Laboratorium 4. JADE Wstęp

Transkrypt

Architektury usług internetowych Laboratorium 4. JADE Wstęp
AUI – laboratorium
Laboratorium 4
Architektury usług internetowych
Laboratorium 4.
JADE
Wstęp
Celem laboratorium jest zapoznanie się z usługami udostępnianymi przez agenty w systemie
agentowym JADE. Każdy z agentów udostępniający usługę może zarejestrować się w katalogu
usług. Według standardu FIPA rolę katalogu pełni agent DF (Directory Facilitator). Agent, który
chce wywołać usługę musi wpierw zlokalizować agenta udostępniającego usługę a następnie za
pomocą wiadomości zażądać jej wykonania.
Uruchomienie
Podczas laboratorium należy wykorzystać JADE 4.0.1 (http://jade.tilab.com/). Do działania
wymagane są pliki jade.jar i commons-codec-1.3.jar.
Przykładowe uruchomienie:
java -cp jade.jar:commons-codec-1.3.jar:. jade.Boot -gui \
baker:aui.agents.Baker;miller:aui.agents.Miller
Parametr gui uruchamia graficzny panel zarządzania agentami pozwalający między innymi na
dodawanie i usuwanie agentów. Parametr baker:aui.agents.Baker uruchomi agenta o nazwie baker,
którego klasa Baker znajduje się w paczce aui.agents.
Kod agenta
Każdy zaimplementowany agent musi dziedziczyć po klasie jade.core.Agent. Przykładowy kod
agenta:
public class MyAgent extends Agent {
@Override
protected void setup() {
super.setup();
//register ontologies
//register languages
//add behaviours
}
}
Metoda setup jest miejscem gdzie powinny zostać zarejestrowane języki i ontologie, z których
agent może korzystać oraz dodane zachowania.
© 2010 Michał Wójcik
1
AUI – laboratorium
Laboratorium 4
Agenty w systemie JADE zorientowane są na zachowania, które są klasami języka Java.
Przykład jednorazowo uruchamianego zachowania:
public class MyBehaviour extends OneShotBehaviour {
@Override
public void action() {
System.out.println(myAgent.getAID());
}
public MyBehaviour(Agent agent) {
super(agent);
}
}
W zachowaniach dostęp do agenta, który jest właścicielem danego zachowania uzyskuje się
poprzez pole myAgent, które jest typu jade.core.Agent. Tworząc zachowania należy korzystać
z konstruktora przyjmującego za parametr referencję do agenta. W przypadku gdy wymagany
będzie dostęp do metod agenta innego niż jade.core.Agent należy dodać odpowiednie pole do
zachowania i zmodyfikować konstruktor.
Usługi
Wszelkie interakcje z agentem DF są zrealizowane na podstawie wymiany wiadomości. System
JADE dostarcza statyczną klasę DFService pozwalająca na interakcję z agentem DF bez jawnego
wykorzystywania wiadomości. Zakłada się że metody są umieszczone w klasie agenta, czyli this
wskazuje na agenta, z którego są wywoływane.
Rejestrowanie usługi w katalogu usług:
protected void registerService(String serviceType) {
DFAgentDescription dfad = new DFAgentDescription();
dfad.setName(getAID());
ServiceDescription sd = new ServiceDescription();
sd.setType(serviceType);
sd.setName(getLocalName() + "-" + serviceType);
dfad.addServices(sd);
try {
DFService.register(this, dfad);
} catch (Exception ex) {
© 2010 Michał Wójcik
2
AUI – laboratorium
Laboratorium 4
}
}
Jako parametr metoda przyjmuje typ usługi, następnie tworzy obiekt opisujący agenta, dodaje do
niego opis usługi i rejestruje agenta w katalogu usług.
Wyrejestrowanie usługi:
protected void deregisterService() {
try {
DFService.deregister(this);
} catch (Exception ex) {
}
}
Ponieważ agent może być tylko raz zarejestrowany w katalogu usług (z dowolną liczbą usług)
podczas wyrejestrowania wystarczy podać jedynie agenta, który chce się wyrejestrować.
Wyszukiwanie usługi:
public DFAgentDescription[] findServices(String type) {
DFAgentDescription[] result = null;
DFAgentDescription dfad = new DFAgentDescription();
ServiceDescription sd = new ServiceDescription();
sd.setType(type);
dfad.addServices(sd);
try {
result = DFService.search(this, dfad);
} catch (Exception ex) {
}
return result;
}
Analogicznie jak w przypadku rejestrowania usługi, tworzony jest obiekt opisujący agenta ale
bez podania nazwy agenta. Podawany jest jedynie opis szukanej usługi.
Ontologie
Ontologia to formalna reprezentacja pewnej dziedziny wiedzy, na którą składa się zapis zbiorów
pojęć (ang. concept) i relacji między nimi. W systemie JADE ontologie dostarczają słownictwa,
którym agenty mogą się posługiwać w komunikacji między sobą.
© 2010 Michał Wójcik
3
AUI – laboratorium
Laboratorium 4
W systemie JADE zostały zdefiniowane trzy elementy ontologii:
•
Predicate – predykat mający wartość true lub false,
•
Concept – koncept opisujący jakieś pojęcie,
•
AgentAction – opis akcji agenta.
Przykład konceptu, konceptu opisującego akcję agenta oraz predykatu:
public class Book implements Concept {
private String author;
private String title;
...
}
public class Sel implements Concept, AgentAction {
private Book book;
...
}
public class Costs implements Predicate {
private Book book;
private int price;
...
}
Przyjęte jest, że ontologie w systemie JADE definiuje się jako singletony. Przykład ontologii
książki:
public class BookOntology extends BeanOntology {
public static final String NAME = "book-ontology";
private static final Ontology instance = new BookOntology();
private BookOntology() {
super(NAME);
try {
© 2010 Michał Wójcik
4
AUI – laboratorium
Laboratorium 4
add(Book.class);
add(Sell.class);
add(Costs.class);
} catch (Exception e) {
}
}
}
Wiadomości
Komunikacja pomiędzy agentami realizowana jest poprzez wysyłanie wiadomości. Klasa
reprezentująca wiadomość to jade.lang.acl.ACLMessage.
Podstawowe właściwości wiadomości:
•
receivers – lista odbiorców,
•
ontology – ontologia dostarczający słownictwo użyte w wiadomości,
•
language – język, w którym zapisana jest wiadomość, JADE dostarcza SLCodec,
•
performative – typ wiadomości:
◦
REQUEST – żądanie wykonania jakiejś akcji,
◦
INFORM – informowanie, np.: o wyniku wykonania akcji,
◦
REFUSE – odmowa wykonania określonej akcji,
◦
NOT_UNDERSTOOD – niezrozumienie wcześniej odebranej wiadomości,
◦
...
W wiadomościach można przesyłać jedynie obiekty Action oraz obiekty implementujące interfejs
Predicate.
Opakowywanie i wysyłanie wiadomości:
ACLMessage msg = new ACLMessage(ACLMessage.request);
msg.addReceiver(agent);
msg.setOntology(BookOntology.NAME);
msg.setLanguage(new SLCodec.getName());
Sell sell = new Sell();
sell.setBook(new Book());
try {
ContentManager cm = myAgent.getContentManager();
cm.fill(msg, new Action(agent, sell));
© 2010 Michał Wójcik
5
AUI – laboratorium
Laboratorium 4
myAgent.send(msg);
} catch (Exception e) {
}
ContentManager pozwala na opakowywanie wiadomości zapisanych za pomocą ontologii.
Podczas tworzenia instancji klasy Action należy dostarczyć dwa parametry, AID agenta
wykonującego akcję oraz Concept opisujący akcję. W tym przypadku agent wysyłający wiadomość
żąda sprzedania książki przez odbiorcę wiadomości dlatego podaje jego AID.
Odbieranie i wypakowywanie wiadomości:
ACLMessage msg = myAgent.receive();
if (msg != null) {
try {
ContentManager cm = myAgent.getContentManager();
ContentElement ce = mcm.extractContent(msg);
if (ce instanceof Action) {
if (((Action) ce).getAction() instanceof Sell) {
ACLMessage reply = msg.createReply();
// sell book
}
}
} catch (Exception e) {
}
}
Przykład
Dostarczony przykład przedstawia kilka agentów dostarczających niezbędnych usług do
wytworzenia chleba. Agent chcący wyprodukować chleb musi kolejno znaleźć usługę farmera
dostarczającego zboże, następnie wysłać je do agenta młynarza zmieniającego zboże w mąkę. Mąkę
należy przesłać do piekarza, który wypiecze z niej chleb.
Opis źródeł projektu:
•
aui.agents -główna paczka projektu:
◦
Baker.java – agent udostępniający usługę dostarczającą chleb,
◦
Farmer.java – agent udostępniający usługę dostarczającą zborze,
◦
Miller.java – agent udostępniający usługę dostarczającą mąkę,
◦
Producer.java – agent wywołujący usługi,
© 2010 Michał Wójcik
6
AUI – laboratorium
Laboratorium 4
◦
ServiceAgent.java – klasa abstrakcyjna dla agentów dostarczających usługi,
◦
behaviours – paczka zawierająca zachowania agentów:
◦
▪
ProducerBehaviour.java – jednorazowe zachowanie agenta wywołującego usługi,
▪
ServiceProviderBehaviour.java – cykliczen zachowanie agentów udostępniających
usługi,
ontology – paczka zawierającą ontologie projektu:
▪
ProductionOntology.java – klasa opisująca ontologię,
▪
types – paczka zawierająca koncepty i predykaty:
▪
•
Bread.java – koncept opisujący chleb,
•
Corn.java – koncept opisujący zboże,
•
Flour.java – koncept opisujący mąkę,
•
MakeResult.java – predykat opisujący wynik wywołanej usługi,
actions – paczka zawierający koncepty opisujące akcje agentów:
•
MakeBread.java – opis akcji przygotowanie chleba,
•
MakeCorn.java – opis akcji przygotowania zboża,
•
MakeFlour.java – opis akcji przygotowania mąki.
Kompilacja:
Wraz z projektem zostały dostarczone pliki build.xml i aui-agents.properties pozwalające na
kompilację za pomocą polecenia ant.
$ant
Wywołanie tego polecenia spowoduje utworzenie katalogu dist zawierającego wszystkie
biblioteki niezbędne do uruchomienia projektu:
Uruchomienie:
java -cp aui-agents.jar:commons-codec.3.jar:jade.jar jade.Boot -gui \
"miller:aui.agents.Miller;farmer:aui.agents.Farmer;baker:aui.agents.Baker"
Wywołanie powyższego polecenia spowoduje uruchomienie środowiska wraz z trzema agentami
udostępniającymi usługi oraz GUI umożliwiającego zarządzanie środowiskiem (w tym tworzenie
nowych agentów).
Dodatkowe informacje na tematy systemu JADE można znaleźć w dokumentacji:
•
JADE Administrators Guide
•
JADE Programmers Guide
© 2010 Michał Wójcik
7