romanova_adelina_lab_4_ready #129

Merged
Alexey merged 1 commits from romanova_adelina_lab_4 into main 2024-01-17 13:12:32 +04:00
11 changed files with 171 additions and 0 deletions
Showing only changes of commit f4ec46b14d - Show all commits

Binary file not shown.

After

Width:  |  Height:  |  Size: 62 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

View File

@ -0,0 +1,57 @@
# Лабораторная работа №4 - Работа с брокером сообщений
## Задание
#### Цель:
Изучение проектирования приложений при помощи брокера сообщений.
#### Задачи:
* Установить брокер сообщений RabbitMQ.
* Пройти уроки 1, 2 и 3 из RabbitMQ Tutorials на любом языке программирования.
* Продемонстрировать работу брокера сообщений.
### Классы:
 1. ```Publisher``` - класс, отвечающий за отправку сообщений
 2. ```Consumer1``` - класс, отвечающий за принятие и обработку сообщений за задержкой 3 секунды
 2. ```Consumer2``` - класс, отвечающий за принятие и обработку сообщений без задержек
#### Ход работы:
На компьютер был установлен брокер сообщений ```RabbitMQ```, после чего все три класса программы были одновременно запущены.
## Работа программы:
Класс ```Publisher``` успешно осуществляет отправку сообщений своим клиентам.
![](Publisher.png "")
Класс ```Consumer1``` осуществляет принятие и обработку сообщений с задержкой в 3 секунды, это можно заметить на видео.
![](Consumer1.png "")
Класс ```Consumer2``` мгновенно осуществляет принятие и обработку сообщений.
![](Consumer2.png "")
## Работа с RabbitMQ Management UI
![](overview.png "")
### Очередь ```Consumer1```
![](qConsumer1.png "")
### Очередь ```Consumer2```
![](qConsumer2.png "")
### Exchange
![](ex.png "")
# Youtube
https://youtu.be/dw7j0WgDmS8

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

View File

@ -0,0 +1,42 @@
package org.example;
import com.rabbitmq.client.*;
public class Consumer1 {
private static final String QUEUE_NAME = "queue1";
private static final String EXCHANGE_NAME = "exchange";
public static void main(String[] args) throws Exception {
try {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
Connection connection = factory.newConnection();
Channel channel = connection.createChannel();
channel.queueDeclare(QUEUE_NAME, false, false, false, null);
channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, "");
DeliverCallback deliverCallback = (consumerTag, delivery) -> {
String message = new String(delivery.getBody());
try {
System.out.println("Consumer1 received" + message);
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(" Consumer1 processed the following message: " + message);
};
channel.basicConsume(QUEUE_NAME, true, deliverCallback, consumerTag -> {});
System.out.println("Consumer1 is waiting for messages");
while (true) {
// Поддержание работы приложения
}
} catch (Exception e) {
e.printStackTrace();
}
}
}

View File

@ -0,0 +1,37 @@
package org.example;
import com.rabbitmq.client.*;
public class Consumer2 {
private static final String EXCHANGE_NAME = "exchange";
private static final String QUEUE_NAME = "queue2";
public static void main(String[] args) throws Exception {
try {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
Connection connection = factory.newConnection();
Channel channel = connection.createChannel();
channel.queueDeclare(QUEUE_NAME, false, false, false, null);
channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, "");
DeliverCallback deliverCallback = (consumerTag, delivery) -> {
String message = new String(delivery.getBody());
System.out.println("Consumer2 received" + message);
// моментальная обработка сообщений
System.out.println("Consumer2 processed the following message: " + message);
};
channel.basicConsume(QUEUE_NAME, true, deliverCallback, consumerTag -> {});
System.out.println("Consumer2 is waiting for messages");
while (true) {
// Поддержание работы приложения
}
} catch (Exception e) {
e.printStackTrace();
}
}
}

View File

@ -0,0 +1,35 @@
package org.example;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import java.util.Random;
public class Publisher {
private static final String EXCHANGE_NAME = "exchange";
public static void main(String[] args) throws Exception {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
try (Connection connection = factory.newConnection();
Channel channel = connection.createChannel()) {
channel.exchangeDeclare(EXCHANGE_NAME, "fanout");
while (true) {
String message = generateMessage(); // Генерация сообщения для журнала событий
channel.basicPublish(EXCHANGE_NAME, "", null, message.getBytes());
System.out.println("Sent: " + message);
Thread.sleep(1000); // Ожидание 1 секунду
}
} catch (Exception e) {
e.printStackTrace();
}
}
private static String generateMessage() {
Random random = new Random();
return "message №" + random.nextInt(100) + 1;
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB