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 |