diff --git a/antonov_dmitry_lab4/README.md b/antonov_dmitry_lab4/README.md index 146a6b0..1086524 100644 --- a/antonov_dmitry_lab4/README.md +++ b/antonov_dmitry_lab4/README.md @@ -16,20 +16,19 @@ # Запуск -Командой в консоли проекта "docker-compose up -d" +Проект запускается в ide просто по нажатию у питон файла на функцию мейн. +Очередь сообщений запускается такой командой +docker run -it --rm --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:3-management # Описание работы: Развернули два приложения Сервисы используем из предыдущей работы Предметная область - врачи и пациенты -1. Сервис с врачами: -- доступ на http://localhost:5000/ +1. Consumer 1 - врач 1: +2. Consumer 2 - врач 2: -2. Сервис с пациентами: -- доступ на http://localhost:5001/ - -Сервисы связываются друг с другом через ссылку и библиотеку requests +Оба врача принимают пациентов. Flask-приложение с RabbitMQ, использующего библиотеку pika для publisher и Celery для consumers. Приложение Flask (app.py), издателя (publisher.py) и двух потребителей (consumer.py). diff --git a/antonov_dmitry_lab4/docker-compose.yml b/antonov_dmitry_lab4/docker-compose.yml deleted file mode 100644 index 0dd0527..0000000 --- a/antonov_dmitry_lab4/docker-compose.yml +++ /dev/null @@ -1,6 +0,0 @@ -version: "2.1" -services: - rabbitmq: - image: rabbitmq:3.10.7-management - ports: - - 15672:15672 \ No newline at end of file diff --git a/antonov_dmitry_lab4/rabbit/app.py b/antonov_dmitry_lab4/rabbit/app.py deleted file mode 100644 index 48d5e59..0000000 --- a/antonov_dmitry_lab4/rabbit/app.py +++ /dev/null @@ -1,21 +0,0 @@ -from celery import Celery -from flask import Flask, render_template - -app = Flask(__name__) - -# Celery конфигурация -app.config['CELERY_BROKER_URL'] = 'pyamqp://guest:guest@localhost//' -app.config['CELERY_RESULT_BACKEND'] = 'rpc://' - -# Создаем инстанс Celery -celery = Celery(app.name, broker=app.config['CELERY_BROKER_URL']) -celery.conf.update(app.config) - - -@app.route('/') -def index(): - return render_template('index.html') - - -if __name__ == '__main__': - app.run(debug=True) diff --git a/antonov_dmitry_lab4/rabbit/consumer.py b/antonov_dmitry_lab4/rabbit/consumer.py deleted file mode 100644 index 315e23e..0000000 --- a/antonov_dmitry_lab4/rabbit/consumer.py +++ /dev/null @@ -1,33 +0,0 @@ -from celery import Celery -import time -import pika - -app = Celery('consumer', broker='pyamqp://guest:guest@localhost//') - - -@app.task -def process_messages(queue_name, delay): - connection = pika.BlockingConnection(pika.ConnectionParameters('localhost')) - channel = connection.channel() - - # Объявляем очередь с именем - channel.queue_declare(queue=queue_name) - - # Привязываем очередь к 'logs' exchange - channel.queue_bind(exchange='logs', queue=queue_name) - - def callback(ch, method, properties, body): - print(f" [x] Получено сообщение: {body}") - time.sleep(delay) - print(f" [x] Обработано сообщение: {body}") - - # Устанавливаем consumer а чтобы получать сообщения из очереди - channel.basic_consume(queue=queue_name, on_message_callback=callback, auto_ack=True) - - print(f' [*] Ожидаем сообщения от {queue_name}') - channel.start_consuming() - - -if __name__ == '__main__': - process_messages.delay('consumer1_queue', 2) # Queue для Consumer 1 с задержкой 2 с - process_messages.delay('consumer2_queue', 0) # Queue для Consumer 2 без задержки diff --git a/antonov_dmitry_lab4/rabbit/publisher.py b/antonov_dmitry_lab4/rabbit/publisher.py deleted file mode 100644 index 1b419cd..0000000 --- a/antonov_dmitry_lab4/rabbit/publisher.py +++ /dev/null @@ -1,23 +0,0 @@ -import pika -import time - -connection_params = pika.ConnectionParameters( - host='localhost', # RabbitMQ server hostname - port=15672, # RabbitMQ server port - credentials=pika.PlainCredentials('guest', 'guest') # credentials -) - -connection = pika.BlockingConnection(connection_params) -channel = connection.channel() - -# Объявляем exchange с именем 'logs' типа 'fanout' -channel.exchange_declare(exchange='logs', exchange_type='fanout') - -# Отдаем сообщение в 'logs' exchange каждую секунду -while True: - message = "Пациент прибыл" # Сообщение - channel.basic_publish(exchange='logs', routing_key='', body=message) - print(f" [x] Отправлено сообщение: {message}") - time.sleep(1) - -connection.close() diff --git a/antonov_dmitry_lab4/rabbitmq/app.py b/antonov_dmitry_lab4/rabbitmq/app.py new file mode 100644 index 0000000..bbd53fe --- /dev/null +++ b/antonov_dmitry_lab4/rabbitmq/app.py @@ -0,0 +1,20 @@ +from flask import Flask, render_template, request +from publisher import publish_message + +app = Flask(__name__) + + +@app.route('/') +def index(): + return render_template('index.html') + + +@app.route('/publish', methods=['GET']) +def publish(): + message = request.form['message'] + publish_message(message) + return 'Пациент прибыл: {}'.format(message) + + +if __name__ == '__main__': + app.run(debug=True) diff --git a/antonov_dmitry_lab4/rabbitmq/consumer1.py b/antonov_dmitry_lab4/rabbitmq/consumer1.py new file mode 100644 index 0000000..b2d94dc --- /dev/null +++ b/antonov_dmitry_lab4/rabbitmq/consumer1.py @@ -0,0 +1,25 @@ +import pika + +def callback(ch, method, properties, body): + print(" [x] Врач 1 принимает пациента '{}'".format(body.decode())) + +def consume_messages(): + connection = pika.BlockingConnection(pika.ConnectionParameters( + host='localhost', # RabbitMQ server hostname + port=5672, # RabbitMQ server port + credentials=pika.PlainCredentials('guest', 'guest') # credentials + )) + channel = connection.channel() + channel.queue_declare(queue='example_queue') + channel.basic_consume(queue='example_queue', on_message_callback=callback, auto_ack=True) + print(' [*] Врач 1 ожидает приема') + try: + channel.start_consuming() + except KeyboardInterrupt: + print('Прервано. Останавливаем прием...') + channel.stop_consuming() + connection.close() + +if __name__ == '__main__': + consume_messages() + diff --git a/antonov_dmitry_lab4/rabbitmq/consumer2.py b/antonov_dmitry_lab4/rabbitmq/consumer2.py new file mode 100644 index 0000000..70d05f3 --- /dev/null +++ b/antonov_dmitry_lab4/rabbitmq/consumer2.py @@ -0,0 +1,25 @@ +import pika + +def callback(ch, method, properties, body): + print(" [x] Врач 2 принимает пациента '{}'".format(body.decode())) + +def consume_messages(): + connection = pika.BlockingConnection(pika.ConnectionParameters( + host='localhost', # RabbitMQ server hostname + port=5672, # RabbitMQ server port + credentials=pika.PlainCredentials('guest', 'guest') # credentials + )) + channel = connection.channel() + channel.queue_declare(queue='example_queue') + channel.basic_consume(queue='example_queue', on_message_callback=callback, auto_ack=True) + print(' Врач 2 ожидает пациента') + try: + channel.start_consuming() + except KeyboardInterrupt: + print('Врач 2 прекращает прием') + channel.stop_consuming() + connection.close() + +if __name__ == '__main__': + consume_messages() + diff --git a/antonov_dmitry_lab4/rabbitmq/publisher.py b/antonov_dmitry_lab4/rabbitmq/publisher.py new file mode 100644 index 0000000..84f8e5d --- /dev/null +++ b/antonov_dmitry_lab4/rabbitmq/publisher.py @@ -0,0 +1,20 @@ +import pika +import time + +def publish_message(message): + connection = pika.BlockingConnection(pika.ConnectionParameters( + host='localhost', # RabbitMQ server hostname + port=15672, # RabbitMQ server port + credentials=pika.PlainCredentials('guest', 'guest') # credentials + )) + channel = connection.channel() + channel.queue_declare(queue='example_queue') + channel.basic_publish(exchange='', routing_key='example_queue', body=message) + # Отдаем сообщение в 'logs' exchange каждую секунду + while True: + message = "Пациент прибыл" # Сообщение + channel.basic_publish(exchange='logs', routing_key='', body=message) + print(f" [x] Отправлено сообщение: {message}") + time.sleep(1) + print(" [x] Отправлено '{}'".format(message)) + connection.close() diff --git a/antonov_dmitry_lab4/screens/img.png b/antonov_dmitry_lab4/screens/img.png new file mode 100644 index 0000000..de6a521 Binary files /dev/null and b/antonov_dmitry_lab4/screens/img.png differ diff --git a/antonov_dmitry_lab4/screens/img_1.png b/antonov_dmitry_lab4/screens/img_1.png new file mode 100644 index 0000000..2474c9a Binary files /dev/null and b/antonov_dmitry_lab4/screens/img_1.png differ diff --git a/antonov_dmitry_lab4/screens/img_2.png b/antonov_dmitry_lab4/screens/img_2.png new file mode 100644 index 0000000..e114bfa Binary files /dev/null and b/antonov_dmitry_lab4/screens/img_2.png differ