diff --git a/mashkova_margarita_lab_4/Consumer1/src/main/java/org/example/Consumer1.java b/mashkova_margarita_lab_4/Consumer1/src/main/java/org/example/Consumer1.java new file mode 100644 index 0000000..550404c --- /dev/null +++ b/mashkova_margarita_lab_4/Consumer1/src/main/java/org/example/Consumer1.java @@ -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) { + // Поддержание работы приложения + } + } + } +} \ No newline at end of file diff --git a/mashkova_margarita_lab_4/Consumer2/src/main/java/org/example/Consumer2.java b/mashkova_margarita_lab_4/Consumer2/src/main/java/org/example/Consumer2.java new file mode 100644 index 0000000..a270f4e --- /dev/null +++ b/mashkova_margarita_lab_4/Consumer2/src/main/java/org/example/Consumer2.java @@ -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) { + // Поддержание работы приложения + } + } + } +} \ No newline at end of file diff --git a/mashkova_margarita_lab_4/Publisher/src/main/java/org/example/Publisher.java b/mashkova_margarita_lab_4/Publisher/src/main/java/org/example/Publisher.java new file mode 100644 index 0000000..626edc4 --- /dev/null +++ b/mashkova_margarita_lab_4/Publisher/src/main/java/org/example/Publisher.java @@ -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(); + } + } +} \ No newline at end of file diff --git a/mashkova_margarita_lab_4/README.md b/mashkova_margarita_lab_4/README.md new file mode 100644 index 0000000..b4a7fe9 --- /dev/null +++ b/mashkova_margarita_lab_4/README.md @@ -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 \ No newline at end of file diff --git a/mashkova_margarita_lab_4/console_consumer1.png b/mashkova_margarita_lab_4/console_consumer1.png new file mode 100644 index 0000000..8fdb219 Binary files /dev/null and b/mashkova_margarita_lab_4/console_consumer1.png differ diff --git a/mashkova_margarita_lab_4/console_consumer2.png b/mashkova_margarita_lab_4/console_consumer2.png new file mode 100644 index 0000000..7b5aa71 Binary files /dev/null and b/mashkova_margarita_lab_4/console_consumer2.png differ diff --git a/mashkova_margarita_lab_4/console_publisher.png b/mashkova_margarita_lab_4/console_publisher.png new file mode 100644 index 0000000..7cbe340 Binary files /dev/null and b/mashkova_margarita_lab_4/console_publisher.png differ diff --git a/mashkova_margarita_lab_4/exchange.png b/mashkova_margarita_lab_4/exchange.png new file mode 100644 index 0000000..79cc49a Binary files /dev/null and b/mashkova_margarita_lab_4/exchange.png differ diff --git a/mashkova_margarita_lab_4/main_report.png b/mashkova_margarita_lab_4/main_report.png new file mode 100644 index 0000000..5c1398c Binary files /dev/null and b/mashkova_margarita_lab_4/main_report.png differ diff --git a/mashkova_margarita_lab_4/queue1.png b/mashkova_margarita_lab_4/queue1.png new file mode 100644 index 0000000..59ac8ce Binary files /dev/null and b/mashkova_margarita_lab_4/queue1.png differ diff --git a/mashkova_margarita_lab_4/queue2.png b/mashkova_margarita_lab_4/queue2.png new file mode 100644 index 0000000..260eaaa Binary files /dev/null and b/mashkova_margarita_lab_4/queue2.png differ