mashkova_margarita_lab_4 ready #107
@ -0,0 +1,47 @@
|
|||||||
|
package org.example;
|
||||||
|
import com.rabbitmq.client.Channel;
|
||||||
|
import com.rabbitmq.client.Connection;
|
||||||
|
import com.rabbitmq.client.ConnectionFactory;
|
||||||
|
import com.rabbitmq.client.DeliverCallback;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.concurrent.TimeoutException;
|
||||||
|
|
||||||
|
public class Consumer1 {
|
||||||
|
private static final String EXCHANGE_NAME = "exchange";
|
||||||
|
private static final String QUEUE_NAME = "queue1";
|
||||||
|
|
||||||
|
public static void main(String[] args) throws IOException, TimeoutException {
|
||||||
|
ConnectionFactory factory = new ConnectionFactory();
|
||||||
|
factory.setHost("localhost");
|
||||||
|
|
||||||
|
try (Connection connection = factory.newConnection();
|
||||||
|
Channel channel = connection.createChannel()) {
|
||||||
|
// Объявление очереди
|
||||||
|
channel.queueDeclare(QUEUE_NAME, false, false, false, null);
|
||||||
|
|
||||||
|
// Привязка очереди к обмену
|
||||||
|
channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, "");
|
||||||
|
|
||||||
|
// Настройка consumer
|
||||||
|
DeliverCallback deliverCallback = (consumerTag, delivery) -> {
|
||||||
|
String message = new String(delivery.getBody());
|
||||||
|
System.out.println(String.format("Получатель 1 получил: '%s'", message));
|
||||||
|
try {
|
||||||
|
Thread.sleep(4000); // Моделирование времени обработки
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
System.out.println(String.format("Получатель 1 обработал: '%s'", message));
|
||||||
|
};
|
||||||
|
|
||||||
|
// Начало приема сообщений
|
||||||
|
channel.basicConsume(QUEUE_NAME, true, deliverCallback, consumerTag -> {
|
||||||
|
});
|
||||||
|
System.out.println("Получатель 1 ожидает сообщений");
|
||||||
|
while (true) {
|
||||||
|
// Поддержание работы приложения
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,48 @@
|
|||||||
|
package org.example;
|
||||||
|
|
||||||
|
import com.rabbitmq.client.Channel;
|
||||||
|
import com.rabbitmq.client.Connection;
|
||||||
|
import com.rabbitmq.client.ConnectionFactory;
|
||||||
|
import com.rabbitmq.client.DeliverCallback;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.concurrent.TimeoutException;
|
||||||
|
|
||||||
|
public class Consumer2 {
|
||||||
|
private static final String EXCHANGE_NAME = "exchange";
|
||||||
|
private static final String QUEUE_NAME = "queue2";
|
||||||
|
|
||||||
|
public static void main(String[] args) throws IOException, TimeoutException {
|
||||||
|
ConnectionFactory factory = new ConnectionFactory();
|
||||||
|
factory.setHost("localhost");
|
||||||
|
|
||||||
|
try (Connection connection = factory.newConnection();
|
||||||
|
Channel channel = connection.createChannel()) {
|
||||||
|
// Объявление очереди
|
||||||
|
channel.queueDeclare(QUEUE_NAME, false, false, false, null);
|
||||||
|
|
||||||
|
// Привязка очереди к обмену
|
||||||
|
channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, "");
|
||||||
|
|
||||||
|
// Настройка consumer
|
||||||
|
DeliverCallback deliverCallback = (consumerTag, delivery) -> {
|
||||||
|
String message = new String(delivery.getBody());
|
||||||
|
System.out.println(String.format("Получатель 2 получил: '%s'", message));
|
||||||
|
try {
|
||||||
|
Thread.sleep(6000); // Моделирование времени обработки
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
System.out.println(String.format("Получатель 2 обработал: '%s'", message));
|
||||||
|
};
|
||||||
|
|
||||||
|
// Начало приема сообщений
|
||||||
|
channel.basicConsume(QUEUE_NAME, true, deliverCallback, consumerTag -> {
|
||||||
|
});
|
||||||
|
System.out.println("Получатель 2 ожидает сообщений");
|
||||||
|
while (true) {
|
||||||
|
// Поддержание работы приложения
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,32 @@
|
|||||||
|
package org.example;
|
||||||
|
|
||||||
|
import com.rabbitmq.client.Channel;
|
||||||
|
import com.rabbitmq.client.Connection;
|
||||||
|
import com.rabbitmq.client.ConnectionFactory;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.concurrent.TimeoutException;
|
||||||
|
|
||||||
|
public class Publisher {
|
||||||
|
private static final String EXCHANGE_NAME = "exchange";
|
||||||
|
|
||||||
|
public static void main(String[] args) throws IOException, TimeoutException {
|
||||||
|
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 = "Пришел заказ №" + Math.round((Math.random() * 100));
|
||||||
|
channel.basicPublish(EXCHANGE_NAME, "", null, message.getBytes());
|
||||||
|
System.out.println(String.format("Отправлено: '%s'", message));
|
||||||
|
Thread.sleep(1000); // Ожидание 1 секунду
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
47
mashkova_margarita_lab_4/README.md
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
# Лабораторная работа №4
|
||||||
|
## ПИбд-42 Машкова Маргарита
|
||||||
|
## Задание
|
||||||
|
Необходимо выбрать предметную область и разработать следующие приложения:
|
||||||
|
|
||||||
|
1. Publisher. Программа, которая создаёт один exchange с типом fanout. Программа должна раз в секунду генерировать
|
||||||
|
сообщения в журнал событий согласно вашей предметной области. Например, событие "пришёл заказ" или "сообщение от
|
||||||
|
пользователя" или "необходимо создать отчёт".
|
||||||
|
2. Consumer 1. Программа, которая создаёт под себя отдельную не анонимную (!) очередь (queue)
|
||||||
|
(то есть имя queue НЕ пустая строка), создаёт binding на exchange и начинает принимать сообщения (consume).
|
||||||
|
Программа должна обрабатывать сообщения 2-3 секунды. Можно реализовать через обычный Thread.Sleep.
|
||||||
|
3. Consumer 2. Аналогично Consumer 1, только сообщения необходимо обрабатывать моментально. Только имя очереди должно
|
||||||
|
отличаться от Consumer 1.
|
||||||
|
|
||||||
|
## Запуск программы
|
||||||
|
Запустить программу `Consumer1`
|
||||||
|
Запустить программу `Consumer2`
|
||||||
|
Запустить программу `Publisher`
|
||||||
|
|
||||||
|
## Описание работы программы
|
||||||
|
Publisher каждую секунду отправляет сообщение `Пришел заказ №`. Consumer1 и Consumer2 получают сообщения, обрабатывают его
|
||||||
|
Consumer1 в течении 4 секунд, Consumer2 в течении 6 секунд.
|
||||||
|
|
||||||
|
## Тесты
|
||||||
|
### Вывод отправителя:
|
||||||
|
![Вывод отправителя](console_publisher.png)
|
||||||
|
|
||||||
|
### Вывод получателя 1:
|
||||||
|
![Вывод получателя1](console_consumer1.png)
|
||||||
|
|
||||||
|
### Вывод получателя 2:
|
||||||
|
![Вывод получателя2](console_consumer2.png)
|
||||||
|
|
||||||
|
### Отчеты из RabbitMQ Management UI:
|
||||||
|
![Основной отчет](main_report.png)
|
||||||
|
|
||||||
|
### Очередь Consumer1:
|
||||||
|
![Очередь Consumer1](queue1.png)
|
||||||
|
|
||||||
|
### Очередь Consumer2:
|
||||||
|
![Очередь Consumer2](queue2.png)
|
||||||
|
|
||||||
|
### Exchange:
|
||||||
|
![Exchange](exchange.png)
|
||||||
|
|
||||||
|
Ссылка на видео:
|
||||||
|
https://youtu.be/9gr2HpZrYyk
|
BIN
mashkova_margarita_lab_4/console_consumer1.png
Normal file
After Width: | Height: | Size: 10 KiB |
BIN
mashkova_margarita_lab_4/console_consumer2.png
Normal file
After Width: | Height: | Size: 9.5 KiB |
BIN
mashkova_margarita_lab_4/console_publisher.png
Normal file
After Width: | Height: | Size: 5.6 KiB |
BIN
mashkova_margarita_lab_4/exchange.png
Normal file
After Width: | Height: | Size: 14 KiB |
BIN
mashkova_margarita_lab_4/main_report.png
Normal file
After Width: | Height: | Size: 60 KiB |
BIN
mashkova_margarita_lab_4/queue1.png
Normal file
After Width: | Height: | Size: 32 KiB |
BIN
mashkova_margarita_lab_4/queue2.png
Normal file
After Width: | Height: | Size: 32 KiB |