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 |