Sunteți pe pagina 1din 6

Ministerul Educației al Republicii Moldova

Universitatea Tehnică a Moldovei

Facultatea Calculatoare, Informatica și Micorelectronică

Departamentul Ingineria Software si Automatica

Raport
Lucrarea de laborator nr. 2
La disciplina: Aplicatii Distribuite Avansate

Tema: Decuplarea componentelor unui sistem cu ajutorul brokerului de


mesaje.

A efectuat:

A verificat: lect.,univ.

Torica Eugeniu

Chișinău 2020
Sarcina:
1) Să se separe aplicaţia curentă în două aplicaţii:
a) Componenta Producător – va fi responsabilă de citirea datelor din fişierul
”input.txt” şi publicarea numerelor în formă de mesaje în brokerul de mesaje
(RabbitMQ). Mesajele vor fi consumate de către componenta Consumator.
Componenta Producător va primi rezultatele de calcul care vor fi efectuate de
componenta Consumator şi le va înscrie în fişierul ”outputs.txt”.
b) Componenta Consumator – va fi responsabilă de consumul datelor din brokerul de
mesaje şi efectuarea calculului. Calculul trebuie să fie efectual de funcţia sleepy
fibonacci

2) Să se scrie o componentă Consumator într-un limbaj diferit de limbajul C. Trebuie să aveţi


două componente Consumator scrise în limbaje diferite.

3) Efectuaţi calculul pentru scenariul cînd există cînd rulează în paralel patru componente
Consumator.

4) Descrieţi succint alegerile făcute în implementarea acestui laborator. Comparaţi


implementarea curentă cu cea făcută pe baza librăriei OpenMPI. Descrieţi avantajele şi
dezavantajele fiecărei abordări.

Acest laborator are obiectivul de a face studenţii familiari cu metodele de decuplare


funcţională, temporală şi tehnologică a componentelor unui sistem cu ajutorul unui broker de
mesaje.
Pentru a solution sarcina data am folosit paternul Remote Procedure Call or RPC.
Pentru a ilustra modul în care poate fi utilizat un serviciu RPC, vom crea o clasă simplă
Client. Va expune o metodă numită “call” care trimite o cerere RPC și se blochează până
când nu primește răspunsul:
In imagine avem reprezentate 4 instante a clasei Server, care consuma mesajele din Brocker.

Dupa ce pornim RPC Client , care trimite requesturile spre Broker, observam ca mesajele
sunt consumate de toate cele 4 instante de Server.
CLasa Client:

package com.example.rabbitmq;
import com.rabbitmq.client.AMQP;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import org.springframework.boot.autoconfigure.SpringBootApplication;

import java.io.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import java.util.UUID;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.TimeoutException;

@SpringBootApplication
public class RPCClient implements AutoCloseable {

private Connection connection;


private Channel channel;
private String requestQueueName = "rpc_queue";

public RPCClient() throws IOException, TimeoutException {


ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");

connection = factory.newConnection();
channel = connection.createChannel();
channel.basicQos(1);
}

public static void save(String fileName, List <String> list) throws


FileNotFoundException {
PrintWriter pw = new PrintWriter(new FileOutputStream(fileName));
for (String mess : list)
pw.write(mess);
pw.close();
}

public static void main(String[] argv) throws FileNotFoundException {


List<String> responseMessages = new ArrayList<>();

Scanner scanner = new Scanner(new File("input.txt"));


int [] tall = new int [50];
int nr = 0;

while(scanner.hasNextInt()){
tall[nr++] = scanner.nextInt();
}

try (RPCClient fibonacciRpc = new RPCClient()) {


for (Integer i : tall) {
String i_str = Integer.toString(i);
System.out.println(" [x] Requesting fib(" + i_str + ")");
String response = fibonacciRpc.call(i_str);
System.out.println(" [.] Got '" + response + "'");
/** add responses to List**/
responseMessages.add(response);
}
/** save responses to an output file **/
save( "output.txt",responseMessages);
} catch (IOException | TimeoutException | InterruptedException e) {
e.printStackTrace();
}

public String call(String message) throws IOException, InterruptedException {


final String corrId = UUID.randomUUID().toString();
/** In order to receive a response we need to send a 'callback' queue
address with the request. **/
String replyQueueName = channel.queueDeclare().getQueue();
AMQP.BasicProperties props = new AMQP.BasicProperties
.Builder()
.correlationId(corrId)/** unique value for every request**/
.replyTo(replyQueueName)/**queue created just for the request,**/
.build();

channel.basicPublish("", requestQueueName, props, message.getBytes("UTF-


8"));

final BlockingQueue<String> response = new ArrayBlockingQueue<>(1);

String ctag = channel.basicConsume(replyQueueName, true, (consumerTag,


delivery) -> {
if (delivery.getProperties().getCorrelationId().equals(corrId)) {
response.offer(new String(delivery.getBody(), "UTF-8"));
}
}, consumerTag -> {
});

String result = response.take();


channel.basicCancel(ctag);
return result;
}

public void close() throws IOException {


connection.close();
}

package com.example.rabbitmq;

import com.rabbitmq.client.*;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class RPCServer {

private static final String RPC_QUEUE_NAME = "rpc_queue";

private static Long fib(int n) {


if (n == 0) return 0L;
if (n == 1) return 1L;
return (fib(n - 1) + fib(n - 2));
}

public static void main(String[] argv) throws Exception {


ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");

try (Connection connection = factory.newConnection();


Channel channel = connection.createChannel()) {
channel.queueDeclare(RPC_QUEUE_NAME, false, false, false, null);
channel.queuePurge(RPC_QUEUE_NAME);

channel.basicQos(1);

System.out.println(" [x] Awaiting RPC requests");

Object monitor = new Object();


DeliverCallback deliverCallback = (consumerTag, delivery) -> {
AMQP.BasicProperties replyProps = new AMQP.BasicProperties
.Builder()
.correlationId(delivery.getProperties().getCorrelationId())
.build();

String response = "";

try {
String message = new String(delivery.getBody(), "UTF-8");
int n = Integer.parseInt(message);

System.out.println(" [.] fib(" + message + ")");


response += fib(n);
} catch (RuntimeException e) {
System.out.println(" [.] " + e.toString());
} finally {
channel.basicPublish("", delivery.getProperties().getReplyTo(),
replyProps, response.getBytes("UTF-8"));
channel.basicAck(delivery.getEnvelope().getDeliveryTag(),
false);
// RabbitMq consumer worker thread notifies the RPC server
owner thread
synchronized (monitor) {
monitor.notify();
}
}
};

channel.basicConsume(RPC_QUEUE_NAME, false, deliverCallback,


(consumerTag -> { }));
// Wait and be prepared to consume the message from RPC client.
while (true) {
synchronized (monitor) {
try {
monitor.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}}}

S-ar putea să vă placă și

  • 5555
    5555
    Document7 pagini
    5555
    VicuPopusoi
    100% (1)
  • Subiecte Examen ARC2018
    Subiecte Examen ARC2018
    Document2 pagini
    Subiecte Examen ARC2018
    VicuPopusoi
    Încă nu există evaluări
  • 1111
    1111
    Document5 pagini
    1111
    VicuPopusoi
    Încă nu există evaluări
  • Fegal 8 Finegal 23 Finterv (4-12) : A0 A1 A2 A3 A4 Fint
    Fegal 8 Finegal 23 Finterv (4-12) : A0 A1 A2 A3 A4 Fint
    Document4 pagini
    Fegal 8 Finegal 23 Finterv (4-12) : A0 A1 A2 A3 A4 Fint
    VicuPopusoi
    Încă nu există evaluări
  • Fituici Pentru Examen La Retele de Calculatoare. (Conspecte - MD)
    Fituici Pentru Examen La Retele de Calculatoare. (Conspecte - MD)
    Document25 pagini
    Fituici Pentru Examen La Retele de Calculatoare. (Conspecte - MD)
    VicuPopusoi
    Încă nu există evaluări
  • 123 Asdf
    123 Asdf
    Document5 pagini
    123 Asdf
    VicuPopusoi
    Încă nu există evaluări
  • 8888
    8888
    Document1 pagină
    8888
    VicuPopusoi
    Încă nu există evaluări
  • Desfăşurarea Lucrării
    Desfăşurarea Lucrării
    Document6 pagini
    Desfăşurarea Lucrării
    VicuPopusoi
    Încă nu există evaluări
  • Modeme Inteligente
    Modeme Inteligente
    Document12 pagini
    Modeme Inteligente
    VicuPopusoi
    Încă nu există evaluări
  • 123 Asdf
    123 Asdf
    Document9 pagini
    123 Asdf
    VicuPopusoi
    Încă nu există evaluări
  • 1234 Asd
    1234 Asd
    Document4 pagini
    1234 Asd
    VicuPopusoi
    Încă nu există evaluări
  • Laborator 4 ASDN
    Laborator 4 ASDN
    Document7 pagini
    Laborator 4 ASDN
    RoscaFlorin
    Încă nu există evaluări
  • Rezolvarea Lucrării:: Tabelul de Adevăr Al Comparatorului
    Rezolvarea Lucrării:: Tabelul de Adevăr Al Comparatorului
    Document2 pagini
    Rezolvarea Lucrării:: Tabelul de Adevăr Al Comparatorului
    VicuPopusoi
    Încă nu există evaluări
  • 1234 Asdf
    1234 Asdf
    Document5 pagini
    1234 Asdf
    VicuPopusoi
    Încă nu există evaluări
  • Si 1
    Si 1
    Document7 pagini
    Si 1
    VicuPopusoi
    Încă nu există evaluări
  • Exam
    Exam
    Document10 pagini
    Exam
    VicuPopusoi
    Încă nu există evaluări
  • L4n DV
    L4n DV
    Document5 pagini
    L4n DV
    UnFGB
    Încă nu există evaluări
  • Fituici Pentru Examen La Retele de Calculatoare. (Conspecte - MD)
    Fituici Pentru Examen La Retele de Calculatoare. (Conspecte - MD)
    Document25 pagini
    Fituici Pentru Examen La Retele de Calculatoare. (Conspecte - MD)
    VicuPopusoi
    Încă nu există evaluări
  • Laborator 3 ASDN
    Laborator 3 ASDN
    Document8 pagini
    Laborator 3 ASDN
    Iulian Decuseara
    Încă nu există evaluări
  • Asdn 4
    Asdn 4
    Document7 pagini
    Asdn 4
    VicuPopusoi
    Încă nu există evaluări
  • L4n DV
    L4n DV
    Document5 pagini
    L4n DV
    UnFGB
    Încă nu există evaluări
  • L4n DV
    L4n DV
    Document5 pagini
    L4n DV
    UnFGB
    Încă nu există evaluări
  • Lab 1
    Lab 1
    Document7 pagini
    Lab 1
    Ramzes CRIS
    Încă nu există evaluări
  • Laborator 2 ASDN
    Laborator 2 ASDN
    Document7 pagini
    Laborator 2 ASDN
    Iulian Decuseara
    Încă nu există evaluări
  • SDAlab 2 Si 3
    SDAlab 2 Si 3
    Document2 pagini
    SDAlab 2 Si 3
    VicuPopusoi
    Încă nu există evaluări
  • SDAlab 4 Si 5
    SDAlab 4 Si 5
    Document1 pagină
    SDAlab 4 Si 5
    VicuPopusoi
    Încă nu există evaluări
  • SDAlab 6
    SDAlab 6
    Document1 pagină
    SDAlab 6
    VicuPopusoi
    Încă nu există evaluări
  • STAT
    STAT
    Document7 pagini
    STAT
    VicuPopusoi
    Încă nu există evaluări
  • SDA
    SDA
    Document1 pagină
    SDA
    danpk1999
    Încă nu există evaluări
  • Lucrare
    Lucrare
    Document6 pagini
    Lucrare
    VicuPopusoi
    Încă nu există evaluări