romanova_adelina_lab_4_ready #129
BIN
romanova_adelina_lab_4/Consumer1.png
Normal file
After Width: | Height: | Size: 62 KiB |
BIN
romanova_adelina_lab_4/Consumer2.png
Normal file
After Width: | Height: | Size: 64 KiB |
BIN
romanova_adelina_lab_4/Publisher.png
Normal file
After Width: | Height: | Size: 42 KiB |
57
romanova_adelina_lab_4/README.md
Normal 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
|
BIN
romanova_adelina_lab_4/ex.png
Normal file
After Width: | Height: | Size: 28 KiB |
42
romanova_adelina_lab_4/java/org/example/Consumer1.java
Normal 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();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
37
romanova_adelina_lab_4/java/org/example/Consumer2.java
Normal 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();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
35
romanova_adelina_lab_4/java/org/example/Publisher.java
Normal 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;
|
||||||
|
}
|
||||||
|
}
|
BIN
romanova_adelina_lab_4/overview.png
Normal file
After Width: | Height: | Size: 44 KiB |
BIN
romanova_adelina_lab_4/qConsumer1.png
Normal file
After Width: | Height: | Size: 46 KiB |
BIN
romanova_adelina_lab_4/qConsumer2.png
Normal file
After Width: | Height: | Size: 44 KiB |