diff --git a/podkorytova_yulia_lab_4/README.md b/podkorytova_yulia_lab_4/README.md new file mode 100644 index 0000000..bc997cd --- /dev/null +++ b/podkorytova_yulia_lab_4/README.md @@ -0,0 +1,45 @@ +# Лабораторная работа 4. Работа с брокером сообщений +### Задание на лабораторную работу +1. Установить брокер сообщений RabbitMQ. +2. Пройти уроки 1, 2 и 3 из RabbitMQ Tutorials на любом языке программирования. +3. Продемонстрировать работу брокера сообщений. + +*** +### Описание работы +Были разработаны 3 приложения на *java*: +1. **Publisher**. Программа, которая создаёт один *exchange* с типом *fanout* и раз в секунду генерирует сообщение. + +![](images/publisher.jpg) + +2. **Consumer1**. Программа, которая создаёт под себя отдельную не анонимную очередь (*queue1*), создаёт *binding* на +*exchange* и начинает принимать сообщения. Программа обрабатывает сообщения 3 секунды. + +![](images/consumer1.jpg) + +3. **Consumer2**. Аналогично *Consumer1*, только сообщения обрабатываются моментально и имя очереди (*queue2*) +отличается от *Consumer1*. + +![](images/consumer2.jpg) + +*** +### Отчеты +***RabbitMQ Management UI*** + +![](images/result1.jpg) + +![](images/result2.jpg) + +***Exchange*** + +![](images/result3.jpg) + +***Очередь Consumer1*** + +![](images/queue1.jpg) + +***Очередь Consumer2*** + +![](images/queue2.jpg) + +### Ссылка на видео: +https://drive.google.com/file/d/19OdXnNM29SjayVZJ1qdsrMFTHkAUGxZf/view?usp=sharing diff --git a/podkorytova_yulia_lab_4/app/src/main/java/org/example/Consumer1.java b/podkorytova_yulia_lab_4/app/src/main/java/org/example/Consumer1.java new file mode 100644 index 0000000..43eb145 --- /dev/null +++ b/podkorytova_yulia_lab_4/app/src/main/java/org/example/Consumer1.java @@ -0,0 +1,50 @@ +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.time.LocalTime; +import java.time.format.DateTimeFormatter; + +public class Consumer1 { + private static final String EXCHANGE_NAME = "messages"; + private static final String QUEUE_NAME = "queue1"; + + public static void main(String[] argv) { + ConnectionFactory factory = new ConnectionFactory(); + factory.setHost("localhost"); + factory.setPort(5672); + factory.setUsername("guest"); + factory.setPassword("guest"); + try (Connection connection = factory.newConnection(); + Channel channel = connection.createChannel()) { + // Создание не анонимной очереди с уникальным именем + channel.queueDeclare(QUEUE_NAME, false, false, false, null); + channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, ""); + + System.out.println(LocalTime.now().format(DateTimeFormatter.ofPattern("HH:mm:ss")) + " Consumer 1 ожидает сообщений..."); + + // Обработка сообщений + DeliverCallback deliverCallback = (consumerTag, delivery) -> { + String message = new String(delivery.getBody()); + System.out.println(LocalTime.now().format(DateTimeFormatter.ofPattern("HH:mm:ss")) + " Consumer 1 обрабатывает " + message); + try { + Thread.sleep(3000); // Обработка 3 секунды + } catch (InterruptedException e) { + e.printStackTrace(); + } + System.out.println(LocalTime.now().format(DateTimeFormatter.ofPattern("HH:mm:ss")) + " Consumer 1 получил " + message); + }; + + channel.basicConsume(QUEUE_NAME, true, deliverCallback, consumerTag -> {}); + while (true) { + // Поддержание работы приложения + } + + } catch (Exception e) { + e.printStackTrace(); + } + } +} diff --git a/podkorytova_yulia_lab_4/app/src/main/java/org/example/Consumer2.java b/podkorytova_yulia_lab_4/app/src/main/java/org/example/Consumer2.java new file mode 100644 index 0000000..46ca4d2 --- /dev/null +++ b/podkorytova_yulia_lab_4/app/src/main/java/org/example/Consumer2.java @@ -0,0 +1,44 @@ +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.time.LocalTime; +import java.time.format.DateTimeFormatter; + +public class Consumer2 { + private static final String EXCHANGE_NAME = "messages"; + private static final String QUEUE_NAME = "queue2"; + + public static void main(String[] argv) { + ConnectionFactory factory = new ConnectionFactory(); + factory.setHost("localhost"); + factory.setPort(5672); + factory.setUsername("guest"); + factory.setPassword("guest"); + try (Connection connection = factory.newConnection(); + Channel channel = connection.createChannel()) { + // Создание не анонимной очереди с уникальным именем + channel.queueDeclare(QUEUE_NAME, false, false, false, null); + channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, ""); + + System.out.println(LocalTime.now().format(DateTimeFormatter.ofPattern("HH:mm:ss")) + " Consumer 2 ожидает сообщений..."); + + // Обработка сообщений + DeliverCallback deliverCallback = (consumerTag, delivery) -> { + String message = new String(delivery.getBody()); + // Обработка моментально, без задержки + System.out.println(LocalTime.now().format(DateTimeFormatter.ofPattern("HH:mm:ss")) + " Consumer 2 получил " + message); + }; + + channel.basicConsume(QUEUE_NAME, true, deliverCallback, consumerTag -> {}); + while (true) { + // Поддержание работы приложения + } + } catch (Exception e) { + e.printStackTrace(); + } + } +} diff --git a/podkorytova_yulia_lab_4/app/src/main/java/org/example/Publisher.java b/podkorytova_yulia_lab_4/app/src/main/java/org/example/Publisher.java new file mode 100644 index 0000000..7df71de --- /dev/null +++ b/podkorytova_yulia_lab_4/app/src/main/java/org/example/Publisher.java @@ -0,0 +1,33 @@ +package org.example; + +import com.rabbitmq.client.Channel; +import com.rabbitmq.client.Connection; +import com.rabbitmq.client.ConnectionFactory; + +import java.time.LocalTime; +import java.time.format.DateTimeFormatter; + +public class Publisher { + private static final String EXCHANGE_NAME = "messages"; + + public static void main(String[] args) throws Exception { + ConnectionFactory factory = new ConnectionFactory(); + factory.setHost("localhost"); + factory.setPort(5672); + factory.setUsername("guest"); + factory.setPassword("guest"); + try (Connection connection = factory.newConnection(); + Channel channel = connection.createChannel()) { + channel.exchangeDeclare(EXCHANGE_NAME, "fanout"); + + while (true) { + String message = "сообщение от пользователя c id = " + Math.round((Math.random() * 100)); + channel.basicPublish(EXCHANGE_NAME, "", null, message.getBytes()); + System.out.println(LocalTime.now().format(DateTimeFormatter.ofPattern("HH:mm:ss")) + " Отправлено: " + message); + Thread.sleep(1000); // Пауза в 1 секунду + } + } catch (InterruptedException e) { + e.printStackTrace(); + } + } +} diff --git a/podkorytova_yulia_lab_4/images/consumer1.JPG b/podkorytova_yulia_lab_4/images/consumer1.JPG new file mode 100644 index 0000000..03be6f1 Binary files /dev/null and b/podkorytova_yulia_lab_4/images/consumer1.JPG differ diff --git a/podkorytova_yulia_lab_4/images/consumer2.JPG b/podkorytova_yulia_lab_4/images/consumer2.JPG new file mode 100644 index 0000000..01b7723 Binary files /dev/null and b/podkorytova_yulia_lab_4/images/consumer2.JPG differ diff --git a/podkorytova_yulia_lab_4/images/publisher.JPG b/podkorytova_yulia_lab_4/images/publisher.JPG new file mode 100644 index 0000000..3691e2b Binary files /dev/null and b/podkorytova_yulia_lab_4/images/publisher.JPG differ diff --git a/podkorytova_yulia_lab_4/images/queue1.JPG b/podkorytova_yulia_lab_4/images/queue1.JPG new file mode 100644 index 0000000..8c47399 Binary files /dev/null and b/podkorytova_yulia_lab_4/images/queue1.JPG differ diff --git a/podkorytova_yulia_lab_4/images/queue2.JPG b/podkorytova_yulia_lab_4/images/queue2.JPG new file mode 100644 index 0000000..61a5ed6 Binary files /dev/null and b/podkorytova_yulia_lab_4/images/queue2.JPG differ diff --git a/podkorytova_yulia_lab_4/images/result1.JPG b/podkorytova_yulia_lab_4/images/result1.JPG new file mode 100644 index 0000000..dcaaf0a Binary files /dev/null and b/podkorytova_yulia_lab_4/images/result1.JPG differ diff --git a/podkorytova_yulia_lab_4/images/result2.JPG b/podkorytova_yulia_lab_4/images/result2.JPG new file mode 100644 index 0000000..a68564a Binary files /dev/null and b/podkorytova_yulia_lab_4/images/result2.JPG differ diff --git a/podkorytova_yulia_lab_4/images/result3.JPG b/podkorytova_yulia_lab_4/images/result3.JPG new file mode 100644 index 0000000..b424dff Binary files /dev/null and b/podkorytova_yulia_lab_4/images/result3.JPG differ