mashkova_margarita_lab_4 ready #107

Merged
Alexey merged 1 commits from mashkova_margarita_lab_4 into main 2024-01-10 11:08:16 +04:00
11 changed files with 174 additions and 0 deletions

View File

@ -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) {
// Поддержание работы приложения
}
}
}
}

View File

@ -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) {
// Поддержание работы приложения
}
}
}
}

View File

@ -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();
}
}
}

View 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

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 60 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB