Przetwarzanie Zespołowe

Podobne dokumenty
Architektury Usług Internetowych. Laboratorium 3. Usługi w środowisku wielo-agentowym

Architektury usług internetowych. Laboratorium 5. JADE

Architektury Usług Internetowych. Laboratorium 5

TEMAT : KLASY DZIEDZICZENIE

UML a kod w C++ i Javie. Przypadki użycia. Diagramy klas. Klasy użytkowników i wykorzystywane funkcje. Związki pomiędzy przypadkami.

Programowanie obiektowe

Enkapsulacja, dziedziczenie, polimorfizm

Java: kilka brakujących szczegółów i uniwersalna nadklasa Object

Informatyka I. Klasy i obiekty. Podstawy programowania obiektowego. dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018

JADE - Java Agent DEvelopment Framework

Dziedziczenie. Streszczenie Celem wykładu jest omówienie tematyki dziedziczenia klas. Czas wykładu 45 minut.

Sposoby tworzenia projektu zawierającego aplet w środowisku NetBeans. Metody zabezpieczenia komputera użytkownika przed działaniem apletu.

Laboratorium 7 Blog: dodawanie i edycja wpisów

Programowanie obiektowe

Klasy i obiekty cz II

Ćwiczenie 1. Kolejki IBM Message Queue (MQ)

Dziedziczenie. Tomasz Borzyszkowski

Programowanie współbieżne Wykład 8 Podstawy programowania obiektowego. Iwona Kochaoska

Obiekt klasy jest definiowany poprzez jej składniki. Składnikami są różne zmienne oraz funkcje. Składniki opisują rzeczywisty stan obiektu.

Zaawansowane aplikacje WWW - laboratorium

JAVA W SUPER EXPRESOWEJ PIGUŁCE

PHP 5 język obiektowy

Aplikacje w środowisku Java

Serwery aplikacji. dr Radosław Matusik. radmat

dr inż. Piotr Czapiewski Tworzenie aplikacji w języku Java Laboratorium 1

Wyjątki. Streszczenie Celem wykładu jest omówienie tematyki wyjątków w Javie. Czas wykładu 45 minut.

Rozdział 4 KLASY, OBIEKTY, METODY

Multimedia JAVA. Historia

Baza danych sql. 1. Wprowadzenie. 2. Repozytaria generyczne

Kurs WWW. Paweł Rajba.

Programowanie obiektowe

Wykład 5 Okna MDI i SDI, dziedziczenie

Wykład 4: Klasy i Metody

Java - tablice, konstruktory, dziedziczenie i hermetyzacja

WebNotarius. Specyfikacja techniczna komunikacji z usługą WebNotarius. wersja 1.1

1. Czynności przygotowujące aplikację działającą na platformie Java SE Biblioteka5 (należy ją pobrać z załącznika z p.1)

Programowanie obiektowe zastosowanie języka Java SE

Wywoływanie metod zdalnych

UML a kod. C++, Java i C#

Konstruktory. Streszczenie Celem wykładu jest zaprezentowanie konstruktorów w Javie, syntaktyki oraz zalet ich stosowania. Czas wykładu 45 minut.

Klasy abstrakcyjne i interfejsy

Architektury Usług Internetowych. Laboratorium 2. Usługi sieciowe

Instrukcja 10 Laboratorium 13 Testy akceptacyjne z wykorzystaniem narzędzia FitNesse

Metody Metody, parametry, zwracanie wartości

ASP.NET MVC. Podstawy. Zaawansowane programowanie internetowe Instrukcja nr 3

Narzędzia i aplikacje Java EE. Usługi sieciowe Paweł Czarnul pczarnul@eti.pg.gda.pl

Wprowadzenie do projektu QualitySpy

WSNHiD, Programowanie 2 Lab. 2 Język Java struktura programu, dziedziczenie, abstrakcja, polimorfizm, interfejsy

Systemy mobilne. Laboratorium. Dostęp do danych GPS w Windows Phone 7

Języki i metody programowania Java Lab2 podejście obiektowe

Programowanie obiektowe

Programowanie obiektowe

Obszar statyczny dane dostępne w dowolnym momencie podczas pracy programu (wprowadzone słowem kluczowym static),

Materiały oryginalne: ZAWWW-2st1.2-l11.tresc-1.0kolor.pdf. Materiały poprawione

xmlns:prism= c. <ContentControl prism:regionmanager.regionname="mainregion" />

Java Zadanie 1. Aby poprawnie uruchomić aplikację desktopową, należy zaimplementować główną metodę zapewniającą punkt wejścia do programu.

Dawid Gierszewski Adam Hanasko

Klasy Obiekty Dziedziczenie i zaawansowane cechy Objective-C

IMIĘ i NAZWISKO: Pytania i (przykładowe) Odpowiedzi

Programowanie obiektowe

Język JAVA podstawy. wykład 2, część 1. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

Wprowadzenie do laboratorium. Zasady obowiązujące na zajęciach. Wprowadzenie do narzędzi wykorzystywanych podczas laboratorium.

1 Atrybuty i metody klasowe

Język JAVA podstawy. wykład 2, część 2. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

Tworzenie i wykorzystanie usług

Diagram klas UML jest statycznym diagramem, przedstawiającym strukturę aplikacji bądź systemu w paradygmacie programowania obiektowego.

Katalog książek cz. 2

Informatyka I. Dziedziczenie. Nadpisanie metod. Klasy abstrakcyjne. Wskaźnik this. Metody i pola statyczne. dr inż. Andrzej Czerepicki

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

Remote Method Invocation 17 listopada 2010

Informatyka II. Laboratorium Aplikacja okienkowa

Interfejsy. Programowanie obiektowe. Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki Politechniki Wrocławskiej

Informacje ogólne. Karol Trybulec p-programowanie.pl 1. 2 // cialo klasy. class osoba { string imie; string nazwisko; int wiek; int wzrost;

Aplikacje w środowisku Java

Remote Method Invocation 17 listopada Dariusz Wawrzyniak (IIPP) 1

1. Które składowe klasa posiada zawsze, niezależnie od tego czy je zdefiniujemy, czy nie?

Wywoływanie metod zdalnych

Podstawy Języka Java

Java RMI. Dariusz Wawrzyniak 1. Podejście obiektowe do budowy systemów rozproszonych. obiekt. interfejs. kliencka. sieć

Podejście obiektowe do budowy systemów rozproszonych

Zaawansowane aplikacje internetowe - laboratorium Web Services (część 1).

Wyjątki (exceptions)

Projektowanie aplikacji internetowych laboratorium

Technologie i usługi internetowe cz. 2

Współpraca z platformą dokumentacja techniczna

AXIS2 - tworzenie usługi sieciowej i klienta Axis Data Binding. dr inż. Juliusz Mikoda mgr inż. Anna Wawszczak

Podejście obiektowe do budowy systemów rozproszonych

Java RMI. Dariusz Wawrzyniak 1. Podejście obiektowe do budowy systemów rozproszonych. obiekt. interfejs. kliencka. sieć

Klasy. dr Anna Łazińska, WMiI UŁ Podstawy języka Java 1 / 13

Git, Bitbucket, IntelliJ IDEA

Java: otwórz okienko. Programowanie w językach wysokiego poziomu. mgr inż. Anna Wawszczak

Dziedziczenie. dr Jarosław Skaruz

Dziedziczenie jednobazowe, poliformizm

Aplikacje RMI

Wykład 7: Pakiety i Interfejsy

Programowanie w języku Java - Wyjątki, obsługa wyjątków, generowanie wyjątków

Laboratorium z przedmiotu: Inżynieria Oprogramowania INP

Obsługa błędów za pomocą wyjątków. Paweł Motofa (140746)

KLASA UCZEN Uczen imię, nazwisko, średnia konstruktor konstruktor Ustaw Wyswietl Lepszy Promowany

Transkrypt:

Przetwarzanie Zespołowe Laboratorium nr 2 Środowisko agentowe JADE część 2 Migracja agentów Boiński Tomasz

Wstęp Podstawową zaletą środowisk agendowych jest możliwość przemieszczania się agentów pomiędzy kontenerami. Dzięki temu agent taki ma możliwość przeszukiwania i gromadzenia o wiele szerszego zakresu informacji niż tylko te dostępne lokalnie. W trakcie tych zajęć utworzony zostanie prosty agent, którego zadaniem będzie przemieszczenie się pomiędzy wszystkimi kontenerami wchodzącymi w skład platformy i pozostawienie w nich jakiegoś śladu. Przygotowanie środowiska Uruchomienie środowiska następuje identycznie jak na poprzednim laboratorium. Należy pamiętać, by CLASSPATH tym razem wskazywał nie na katalog z przykładami a na katalog, gdzie zawarty jest kod tworzonego agenta mobilnego. Tworzenie agenta mobilnego Kodowanie agenta najlepiej przeprowadzić w jakimś IDE, które ułatwi nam tą jednak dość skomplikowaną sprawę. W Netbeans należy utworzyć standardową aplikację Java, a następnie dodać (klikając prawym klawiszem na Libraries i wybierając Add Jar/Folder) wszystkie biblioteki wchodzące w skład JADE (czyli te, które dodawano wcześniej do CLASSPATH). Dzięki temu Netbeans będzie podpowiadał klasy i pozwalał na weryfikację kodu na bieżąco. Automatycznie też zapewni importowanie odpowiednich klas wykorzystywanych w trakcie zajęć. Agenta mobilnego tworzymy jak każdego innego agenta, rozpoczynamy od klasy agenta która dziedziczy po klasie Agent. public class MobileAgent extends Agent { protected void setup() { System.out.println("Hello World! My name is " + getlocalname()); Agent ten będzie migrował pomiędzy różnymi kontenerami, więc potrzebne jest nam pole przechowujące kontenery, jakie pozostały do odwiedzenia. Jak atrybut klasy dodajemy więc: private Vector locations; a wewnątrz metody setup() (będącej swoistym konstruktorem) inicjalizację tego pola. locations = new Vector(); Aby Agent mógł się przemieszczać konieczne jest pobranie listy dostępnych lokacji. Procedura ta polega na odpytaniu Głównego Kontenera o ontologie platformy. Odbywa się ona poprzez standardową wymianę komunikatów w języku SL0. Z kolei interpretacja otrzymanej listy odbywać się będzie na podstawie ontologii opisującej konfigurację platformy. Stąd konieczne jest zarejestrowanie w agencie następujących usług:

// rejestracja obsługi języka komunikatów SL0 getcontentmanager().registerlanguage(new SLCodec(), FIPANames.ContentLanguage.FIPA_SL0); // rejestracja ontologii getcontentmanager().registerontology(mobilityontology.getinstance()); Oba te wywołania należy dodać do metody setup, gdyż są częścią inicjalizacji agenta. Środowisko JADE definiuje kilka standardowych metod agenta, które są automatycznie wykonywane w wyniku zajścia jakiejś akcji. Ich bazowe implementacje są dziedziczone po klasie Agent, jednak zalecane jest ich zaimplementowanie, co umożliwia np. komunikację z użytkownikiem czy wykonanie jakiś istotnych operacji przed zmigrowaniem do innego kontenera. Są to między innymi: takedown() - metoda wykonywana bezpośrednio przed zabiciem agenta (najczęściej wywołanym poprzez metodę dodelete();) beforeclone() - metoda wykonywana bezpośrednio przed sklonowaniem agenta albo poprzez akcję interfejsu albo poprzez wykonanie metody doclone(location kont, String nazwa); afterclone() - metoda wykonana bezpośrednio po sklonowaniu agenta beforemove() - metoda wykonana bezpośrednio przed przeniesieniem agenta do docelowego kontenera (zazwyczaj za pomocą metody domove(location kontener);) aftermove() - metoda wykonywana bezpośrednio po przeniesieniu agenta afterload() - metoda wykonywana bezpośrednio po załadowaniu agenta beforefreeze() - metoda wywoływana bezpośrednio przed wstrzymaniem działania agenta, zazwyczaj wykonywanego metodą dofreeze() afterthaw() - metoda wykonywana bezpośrednio po powrocie agenta ze stanu wstrzymania beforereload() - metoda wykonywana bezpośrednio przed reinicjalizacją agenta afterreload() - metoda wykonana bezpośrednio po reinicjalizacji agenta W naszym przypadku, aby w pełni wykorzystać i zobrazować wędrówkę agenta, konieczne jest zaimplementowanie metod beforemove() oraz aftermove() tak, by agent informował nas o swoim bieżącym położeniu. Jeżeli agent po wędrówce miałby móc odbierać komunikaty tak jak na oryginalnym kontenerze, konieczne jest ponowne wykonanie rejestracji odpowiednich usług. W naszym przykładzie to nie będzie konieczne, jedna jeżeli agent miałby odświeżać listę kontenerów po każdej migracji konieczne by było ponowne zarejestrowanie obsługi języka SL0, ontologii platformy oraz pobranie dostępnych lokalizacji (o tym później). protected void beforemove() { System.out.println(getLocalName() + " is now moving elsewhere."); protected void aftermove() { System.out.println(getLocalName() + " is just arrived to this location."); Metoda getlocalname() zwraca nazwę agenta nadaną mu w trakcie jego tworzenia.

W naszej implementacji potrzebne będą jeszcze metody set i get umożliwiające dostęp do wektora zawierającego możliwe do odwiedzenia lokacje. public Vector getlocations() { return locations; public void setlocations(vector locations) { this.locations = locations; Nasz agent jest już prawie gotowy. Potrzebne są jeszcze dwa kluczowe elementy: pobieranie listy dostępnych lokacji oraz właściwe przemieszczanie się agenta w obrębie platformy. Obie te czynności są przykładem zachowania agenta i będą zaimplementowane poprzez klasy dziedziczące po Behaviour. Zajmijmy się najpierw tym drugim elementem. Jego implementacja jest o wiele prostsza. Opiera się o znane już z poprzedniego laboratorium wywołanie klasy TickerBehaviour, które dodajemy wewnątrz metody setup naszego agenta. addbehaviour(new TickerBehaviour(this, 6000) { protected void ontick() { if (((MobileAgent) myagent).getlocations().size() > 0) { Location location = (Location) ((MobileAgent) myagent).getlocations().remove(locations.size() - 1); else { System.out.println("Agent " + myagent.getlocalname() + " trying to move to new location " + location.tostring()); myagent.domove(location); ); System.out.println("Agent " + myagent.getlocalname() + " visited all possible places"); myagent.dodelete(); Co się tutaj dzieje? Do agenta dodajemy zachowanie (addbehaviour) będące klasą typu TicketBehaviour wykonywaną co określoną ilość czasu (w milisekundach). Zadaniem tej klasy jest sprawdzenie co wskazany odcinek czasu (poprzez automatyczne wykonanie metody ontick()) czy na liście znanych lokacji coś się jeszcze znajduje, a jeżeli tak to pobranie wartości z końca listy i przeniesienie tam agenta (domove(location lokacja);). Jeżlei lista jest pusta metoda ta spowoduje zakończenie działania agenta poprzez wykonanie standardowej metody dodelete(); Na liście lokacji znajdują się odpowiednio przygotowane obiekty typu Location pobrane przez pierwsze z wspomnianych zachowań. Aby agent zaczął poprawnie działać pozostaje zaimplementować obsługę pobierania dostępnych lokacji. Operacja ta jest na tyle skomplikowana, że utworzymy dla niej osobną klasę. Proszę więc w

środowisku Netbeans utworzyć (w tym samym pakiecie co klasa agenta) klasę GetAvailableLocationsBehaviour. Deklaracja tej klasy powinna wyglądać następująco: public class GetAvailableLocationsBehaviour extends SimpleAchieveREInitiator { Klasa ta dziedziczy po SimpleAchieveREInitiator. Jest to specjalna klasa typu Behaviour stosowana do komunikacji z platformą poprzez język zgodny ze standardem FIPA. Ciało tej klasy składa się z 3 elementów: pola przechowującego nadchodzącą wiadomość konstruktora definiującego parametry kounikacji itp. handlerów zajmujących się odbieraniem informacji ze środowiska Pierwszy z tych elementów jest trywialny pole te to znany z poprzednich zajęć obiekt typu ACLMessage. Należy go po prostu zdefiniować: private ACLMessage request; Drugim wspomnianym elementem jest konstruktor klasy. Jego opis wykonany zostanie w postaci komentarzy do kodu: public GetAvailableLocationsBehaviour(MobileAgent a) { //wywołujemy konstruktor klasy nadrzędnej, jako jej parametry musimy podać //referencję do agenta oraz typ wysyłanej wiadomości (Request żądanie, gdyż //wysyłamy żądanie o opis środowiska) super(a, new ACLMessage(ACLMessage.REQUEST)); //tworzymy obiekt żądania request = (ACLMessage) getdatastore().get(request_key); //następnie inicjujemy je zgodnie ze standardem FIPA odpowiednio: //usuwając wszystkich odbiorców request.clearallreceiver(); //dodając jako odbiorcę agenta zarządzającego platformą request.addreceiver(a.getams()); //definiując język konwersacji request.setlanguage(fipanames.contentlanguage.fipa_sl0); //określając ontologię opisującą środowisko request.setontology(mobilityontology.name); //oraz definiując protokół komunikacji request.setprotocol(fipanames.interactionprotocol.fipa_request); //następnie wysyłamy wiadomość try { Action action = new Action();

action.setactor(a.getams()); //definiując co chcemy tak naprawdę od AMS uzyskać (listę lokalizacji) action.setaction(new QueryPlatformLocationsAction()); a.getcontentmanager().fillcontent(request, action); catch (Exception fe) { fe.printstacktrace(); //aby możliwe było wysyłanie innych komunikatów należy zresetować obiekt //żądania reset(request); Kolejnym etapem konstrukcji klasy jest zdefiniowanie uchwytów obsługujących wiadomości zwrotne. Konieczne jest zaimplementowanie 5 uchwytów: uchwytu obsługującego niezrozumiałe komunikaty protected void handlenotunderstood(aclmessage reply) { System.out.println(myAgent.getLocalName() + " handlenotunderstood : " + reply.tostring()); uchwytu obsługującego odmowy protected void handlerefuse(aclmessage reply) { System.out.println(myAgent.getLocalName() + " handlerefuse : " + reply.tostring()); uchwytu obsługującego błędy protected void handlefailure(aclmessage reply) { System.out.println(myAgent.getLocalName() + " handlefailure : " + reply.tostring()); uchwytu obsługującego potwierdzenia protected void handleagree(aclmessage reply) { oraz najważniejszego z naszego punktu widzenia, uchwytu obsługującego informacje będące odpowiedzią na nasze zapytania protected void handleinform(aclmessage inform) { //pobranie treści wiadomości informacyjnej String content = inform.getcontent(); try { //i wyłuskanie z niego właściwej odpowiedzi będącej listą //dostępnych lokacji Result results = (Result) myagent.getcontentmanager().extractcontent(inform); //listę tą konwersujemy na wektor (by było łatwiej ją obsłużyć)

Vector locations = new Vector(); Iterator iter = results.getitems().iterator(); for (; iter.hasnext();) { Object obj = iter.next(); locations.add((location) obj); //i przekazujemy do naszego agenta za pośrednictwem zdefiniowanej //w nim metody setlocations ((MobileAgent)myAgent).setLocations(locations); catch (Exception e) { e.printstacktrace(); Agent jest prawie gotowy. Wystarczy jeszcze tylko do metody setup() agenta dopisać aktywację właśnie zaimplementowanego zachowania. Przed wcześniej zdefiniowanym zachowaniem wykonującym właściwą migrację dopisujemy linijkę: addbehaviour(new GetAvailableLocationsBehaviour(this)); Agent jest już gotowy. Po jego kompilacji i uruchomieniu powinien on sczytać listę kontenerów wchodzących w skład platformy a następnie przejść się po ich wszystkich kończąc na kontenerze głównym. Zadanie 1. Zaimplementować agenta mobilnego 2. Uruchomić go na platformie składającej się z przynajmniej 2 kontenerów położonych na przynajmniej 2 fizycznych komputerach 3. Agent ma informować o wykonywanych czynnościach 4. Zmodyfikować kod agenta tak, by po migracji pokazywał graficzne okienko z powitaniem