Documente Academic
Documente Profesional
Documente Cultură
Raport
Lucrarea de laborator nr. 1
Disciplina PAD
Tema: Agent de mesagerie – Message Broker
Chişinău 2017
Scopul lucrarii: Integrarea bazată pe agenți de mesaje care ar permite o comunicare asincronă
dintre componentele distribuite ale unui sistem.
Acest obiect este compus din perechea “nume-valoare”, unde numele este String si valoarea este orice alt tip
a JsonElement
Serializarea se realizeaza prin tranformarea cu ajutorul clasei ObjectOutputStream care transforma un
obiect in bytes si este scris intr-un stream care se transmite la alt host (receiver).
Desirealizarea – este procesul prin care un stream de bytes este convertit intr-un obiect complex cum ar fi
JSON.
Obiectele ObjectOutputStream si ObjectInputStream pot sa realizeze serializarea daca obiectul transmis
poate fi serializat, de aceea la transmitere obiectul JSON se transmite ca un String.
La desirealizare acesta este primit ca un String si apoi din String este format Obiectul JSON propriu zis.
gson = new Gson();
jsonElement = gson.fromJson(objectInputStream.readObject().toString(),
JsonElement.class);
jsonObject = jsonElement.getAsJsonObject();
Apoi din acest JsonObiect se pot manipula elementele acestuia in modul urmator:
future.get().get("Sender:") + future.get().get("mesaj:"))
while(true){
Socket socket = this.serverSocket.accept();
new Thread( new Broker(socket)).start();
}
Broker-ul mereu asculta si este legat de un anuit PORT, atunci cind cineva intentioneaza sa se conecteze la
portul deschis de Broker, acesta isi creeaza o instanta noua pe un fir de executie diferit.
Chiar daca pentru fiecare sender si receiver se creeaza defapt cite o instanta noua, aceasta are resursele sale
statice ceea ce inseamna ca sunt resurse ale clasei insa nu ale instantei.
private static BlockingQueue<JsonObject> jsonQueu = new
ArrayBlockingQueue<>(40);
private static Map<Socket,ObjectOutputStream> receiveri = new
ConcurrentHashMap<>();
5) Implimentarea asincronismului
Java ofera java.util.concurent.ExecutorService interfata care reprezinta un mecanizm de executie asincron care
este capabil sa execute anumite Task-uri in background.
Atunci cind are loc transmiterea mesajelor serializate ele mai intii de toate sunt scoase din aceasta coada. Apoi
obiectul este convertit in bytes si tranmis catre receiver.
Runnable
Broker
- bufferedReader: BufferedReader
- jsonObject: JsonObject
- jsonQueu: BlockingQueue<JsonObject> = new ArrayBlocki...
- receiveri: Map<Socket,ObjectOutputStream> = new ConcurrentH...
- socket: Socket
- toti: Map<Socket,ObjectOutputStream> = new ConcurrentH...
+ Broker(Socket)
+ checkForEmptyAndSendAsync(String): void
+ createJSON(String): void
+ ifSubscribe(String): void
+ run(): void
+ sendAndSerialize(Map<Socket,ObjectOutputStream>): void
Receiv er
- gson: Gson
Sender - jsonElement: JsonElement
- bufferedReaderFromRemote: BufferedReader = null - jsonObject: JsonObject
- printWriter: PrintWriter = null - keybordScanner: Scanner
- socket: Socket = null - objectInputStream: ObjectInputStream
- printWriter: PrintWriter
+ main(String[]): void - socket: Socket
+ sendMessages(): void
+ desirealizeStringObject(): JsonObject
1..* 1..* + getMessages(): void
+ main(String[]): void
brokerServ ice
+ connection(): void
+ main(String[]): void
Concluzie
Realizind acest laborator am insusit de ce este necesar ca schimbul de mesaje dintre careva componente sa
fie procesate de un agent (de mesagerie). Acesta avind mai multe benefii asupra intregii platforme precum:
- reduce cuplarea: transmitatorii comunica doar cu brokerul, astfel o potential grupare a mai
multor receptori sub un nume logic comun poate deveni transparenta transmitatorilor.
- Mareste integrabilitatea: aplicatia care comunica cu brokerul nu trebuie sa aiba aceeasi interfata,
astfel brokerul poate deveni o punte dintre aplicatii cu diferite nivele de securitate si calitate.
- Mareste evolutivitatea: brokerul protejeaza componentele de modificarile individuale ale
aplicatiilor integrate.
Totodata am implimentat ca fiecare componenta sa se execute pe un fir de executie aparte ceea ce este destul
de important pe o platforma. Realizarea asincronizmului este o parte necesara pentru a nu crea blocari in
momentul de transmitere si procesare.
Bibliografie
1. http://tutorials.jenkov.com/java-util-concurrent/executorservice.html/ Jenkov/ 02.10.2017
2. http://stackoverflow.com/questions/4110664/gson-directly-convert-string-to-jsonobject-no-pojo
08.10.2017