RabbitMQ, Python и Windows. Step By Step

13.12.18

Интеграция - Внешние источники данных

Работа с шиной RabbitMQ, используя Python на Windows. Пошаговый быстрый старт.

Здравствуйте! Хочу поделиться своим опытом написания на языке Python служб для работы с шиной RabbitMQ. Видел много публикаций, в тч и на этом ресурсе, с реализацией на C#. Я решил пойти по более простому и короткому пути - не интегрировать отправку и получения сообщений в 1С. 1С у меня занимается только генерацией файлов обмена. Всю остальную работу уже делают службы Windows, написанные на Python.

Ну что ж, приступим...

Для начала установил я Python с оф сайта ссылка для Windows.

Далее с помощью системы управления пакетами pip нужно установить пакет для работы с RabbitMQ - pika. В командной строке CMD нужно ввести команду:

pip install pika

После установки пакета можно приступать к написанию скриптов на Python.

Сред для разработки на Python очень много. Лично я использовал JetBrains PyCharm Community Edition ссылка. После установки нужно создать проект и пару файлов .py. Один из файлов будет службой отправки сообщений, другой - получения из RabbitMQ.

1. Пример файла sender.py для службы отправки сообщения:

#!/usr/bin/env python
import pika, os, sys

# имя файла обмена для отправки в RMQ
fileName = "d:/to_rabbit.xml"

credentials = pika.PlainCredentials('user_name', 'password')
connection = pika.BlockingConnection(pika.ConnectionParameters('host_name',
                                                               5672,
                                                               '/',
                                                               credentials))
channel = connection.channel()

# создаем очередь с заданным именем для отправки
channel.queue_declare(queue='send_queue', durable=True)

while True:
    # если файл существует, осуществляем отправку
    if os.path.isfile(fileName):

        file = open(fileName, "r", encoding="utf-8")
        messageBody = file.read()
        file.close()

        channel.basic_publish(exchange='exchange',
                              routing_key='key',
                              body=messageBody,
                              properties=pika.BasicProperties(delivery_mode=2,)
                              )

        #удалим файл после отправки
        os.remove(fileName)

2. Пример файла consumer.py для получения сообщения:

#!/usr/bin/env python
import pika, time, sys

# имя файла, который будем забирать для обработки в 1С
fileName = "d:/from_rabbit.xml"

credentials = pika.PlainCredentials('user_name', 'password')
connection = pika.BlockingConnection(pika.ConnectionParameters('host_name',
                                                               5672,
                                                               '/',
                                                               credentials))
channel = connection.channel()

# забираем из очереди 
channel.queue_declare(queue='consume_queue', durable=True)

def callback(ch, method, properties, body):
    file = open(fileName, "w", encoding="utf-8")
    file.write(body.decode("utf-8"))
    file.close()
    # время ожидания чтобы на стороне 1С успел обработаться файл
    time.sleep(body.count(b'.')/100)
    ch.basic_ack(delivery_tag = method.delivery_tag)

channel.basic_qos(prefetch_count=1)

channel.basic_consume(callback,
                      queue='consume_queue')

channel.start_consuming()

Параметры user_name, password, host_name, send_queueconsume_queueexchange и key нужно задать самостоятельно.

Лично я использовал 2 очереди для обмена сообщений: одна для отправки send_queue, другая для получения consume_queue. Так же в консоли RabbitMQ нужно не забыть забиндить (Bind) наши очереди на наш обмен exchange.

 

Все, скрипты готовы. Осталось совсем чуть-чуть - создать на их основании службы для отправки и получения. Для этого я использовал утилиту nssm ссылка.

Качаем, распаковываем и создаем службы:

1. Служба для отправки (команда в CMD):

d:\nssm-2.24\win64>nssm.exe install SenderRMQ

2. Служба для получения (команда в CMD):

d:\nssm-2.24\win64>nssm.exe install ConsumerRMQ

После нажатия Install service службы установлены. Наш обмен готов. Спасибо за внимание!

rabbitmq python windows

См. также

Внешние источники данных Программист Бизнес-аналитик Пользователь Платформа 1С v8.3 Управляемые формы Анализ и прогнозирование 1C:Бухгалтерия Узбекистан Беларусь Кыргызстан Молдова Россия Казахстан Платные (руб)

Готовое решение для автоматической выгрузки данных из 1С 8.3 в базу данных ClickHouse, PostgreSQL или Microsoft SQL для работы с данными 1С в BI-системах. «Экстрактор данных 1С в BI» работает со всеми типовыми и нестандартными конфигурациями 1С 8.3 и упрощает работу бизнес-аналитиков. Благодаря этому решению, специалистам не требуется быть программистами, чтобы легко получать данные из 1С в вашей BI-системе.

28500 руб.

15.11.2022    23563    28    49    

42

Зарплата Внешние источники данных Бюджетный учет Перенос данных 1C Системный администратор Программист Платформа 1С v8.3 Сложные периодические расчеты 1С:Зарплата и кадры государственного учреждения 3 Государственные, бюджетные структуры Россия Бухгалтерский учет Бюджетный учет Платные (руб)

Обработка позволяет перенести кадровую информацию и данные по заработной плате, фактическим удержаниям, НДФЛ, вычетам, страховым взносам из базы Парус 8 учреждений (далее Парус) в конфигурацию 1С:Зарплата и кадры государственного учреждения ред. 3 (далее 1С) и начать с ней работать с любого месяца года.

120000 руб.

19.08.2020    26883    26    1    

28

Внешние источники данных Платформа 1С v8.3 1C:Бухгалтерия Платные (руб)

Готовая интеграция для управляемых форм. Встраивается в вашу 1С как расширение. Реализует автоматический обмен данными между 1С (1С:Фитнес клуб и аналогов) и СКУД RusGuard, автоматизирует бизнес-процессы по созданию и учету сотрудников в СКУД. Значительно упрощает работу специалистов отдела кадров и отдела безопасности: избавляет от двойного ввода информации в 1С и СКУД.

94999 руб.

11.07.2024    1414    1    0    

3

Розничная торговля Внешние источники данных Файловый обмен (TXT, XML, DBF), FTP Системный администратор Программист Бухгалтерский учет 1С:Бухгалтерия 3.0 Фармацевтика, аптеки Россия Бухгалтерский учет Платные (руб)

Внешняя обработка загрузки данных из файла-выгрузки, сформированного в программе F3 TAIL версии 3.4 (и выше) или еФарма версии 2.1, в базу конфигурации 1С: Бухгалтерия предприятия 8, ред. 3.0 (базовая, ПРОФ, КОРП, ФРЕШ).

13200 руб.

19.12.2016    48957    101    106    

72
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. s_vidyakin 68 13.12.18 17:18 Сейчас в теме
а если 1С не шмогла обработать файл, как сказать отдавшей стороне что надо его исправить и повторить выгрузку?
2. kuzyara 2140 13.12.18 19:44 Сейчас в теме
(1) транспорт новый, а протокол то старый ;)
И раз, и два.
w.r.; CSiER; +2 Ответить
3. w.r. 653 14.12.18 07:37 Сейчас в теме
(1)

(2)

Именно такая реализация у меня есть - обмен сделан через план обмена с контролем по номеру принятого и отправленного сообщений. То есть контроль работает на стороне 1С.

RabbitMQ для меня просто транспорт сообщений между системами.

Хотя можно реализовать аналогичный функционал (записывать номера принятого и отправленного сообщений) в свойство headres в properties

Метод basic_publish для отправки:

properties=pika.BasicProperties(delivery_mode=2,headers={'MessageNo':1, 'ReceivedNo':1})


Метод callback для получения

MessageNo = properties.headers['MessageNo']
ReceivedNo= properties.headers['ReceivedNo']
4. minimajack 80 14.12.18 08:23 Сейчас в теме
time.sleep(body.count(b'.')/100)
- дичь
А что будет если службу 1С приостановили?
5. w.r. 653 14.12.18 08:29 Сейчас в теме
(4) значит сообщение не обработается в 1С и система 2 отправит его снова вместе с новыми данными, потому что от 1С не придет ответа о его обработке
6. hazyaka 12.03.19 09:37 Сейчас в теме
Хочу понять чем обыкновенный ftp хуже? или почтовый сервер?
7. w.r. 653 12.03.19 20:21 Сейчас в теме
(6) поддержка очереди сообщений + можно одно сообщение нескольким потребителям отдавать
8. vis_tmp 32 25.04.20 14:08 Сейчас в теме
Никак не могу найти, есть ли возможность для 7.7 использовать Rabbit MQ ?
9. user699601_khaladji 13.08.20 17:49 Сейчас в теме
Изучаю этом вашем примере RabbitMQ.
"использовал 2 очереди для обмена сообщений" - непонятно куда привязать consume_queue.
Producer -> exchange -> send_queue -> Consumer - так работает
10. alex_bob 258 03.09.21 09:05 Сейчас в теме
(1) sender.py процессор не напрягает? Может стоит sleep() внутрь цикла вставить?
Оставьте свое сообщение