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

См. также

Перенос данных из Парус 10 в ЗГУ ред.3

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

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

60000 руб.

05.10.2022    9156    9    8    

10

Перенос данных из Парус 8 в ЗГУ 3

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

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

84000 руб.

19.08.2020    22354    18    1    

21

Автоматическая многопоточная выгрузка данных 1С 8.3 в БД Clickhouse и MS SQL (для работы с данными 1С в BI-системах)

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

Готовое решение для автоматизированной выгрузки данных из 1С 8.3, а также MS Excel в базу данных ClickHouse, а также в Microsoft SQL для работы с данными 1С в Yandex Datalens, Visiology, Apache Superset (и не только) - "Экстрактор данных 1С в BI". Решение отлично работает со всеми типовыми (и не только) конфигурациями 1С 8.3 для управляемых форм. Gозволяет автоматизировать работу бизнес-аналитика по ежедневной выгрузке данных из 1С в БД ClickHouse для последующей работы с этой БД в Yandex Datalens/ Система полностью автоматизирует работу с хранилищем данных в БД Clickhouse/MS SQL. Не надо быть программистом, чтобы одной кнопкой получать любые данные из 1С в Вашей BI-системе

230000 руб.

15.11.2022    12920    12    47    

28

Перенос данных из Парус 7.хх в ЗГУ ред.3

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

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

24000 руб.

24.04.2017    48631    96    159    

86

Перенос начальных остатков из Парус 7.71 в БГУ

Внешние источники данных Взаиморасчеты Учет ОС и НМА Логистика, склад и ТМЦ Бюджетный учет Платформа 1С v8.3 Бухгалтерский учет 1С:Бухгалтерия 2.0 1С:Бухгалтерия государственного учреждения Государственные, бюджетные структуры Россия Бюджетный учет Платные (руб)

Перенос словарей и начальных остатков из ПП Парус-Бухгалтерия Бюджет 7.71 в 1Сv8 БГУ2. Заполнение словарей и документов по вводу начальных остатков. Не требуется установка ПП Парус7. Возможна дозагрузка. Позволит автоматически и наиболее полно ввести данные в программу для начала работы. 

15600 руб.

08.12.2011    81473    128    123    

146

Перенос данных из Парус 10 (Торнадо) в ЗГУ ред.3 через Excel

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

Обработка позволяет перенести кадровую информацию и данные по заработной плате из Парус 10(Торнадо) учреждений через файлы Excel в конфигурацию 1С:Зарплата и кадры государственного учреждения ред. 3 (ЗГУ). В принципе, обработка может быть использована для загрузки из файлов Excel, полученных из любых информационных систем.

24000 руб.

16.11.2018    29981    20    31    

21
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. s_vidyakin 63 13.12.18 17:18 Сейчас в теме
а если 1С не шмогла обработать файл, как сказать отдавшей стороне что надо его исправить и повторить выгрузку?
2. kuzyara 1896 13.12.18 19:44 Сейчас в теме
(1) транспорт новый, а протокол то старый ;)
И раз, и два.
w.r.; CSiER; +2 Ответить
3. w.r. 643 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. 643 14.12.18 08:29 Сейчас в теме
(4) значит сообщение не обработается в 1С и система 2 отправит его снова вместе с новыми данными, потому что от 1С не придет ответа о его обработке
6. hazyaka 12.03.19 09:37 Сейчас в теме
Хочу понять чем обыкновенный ftp хуже? или почтовый сервер?
7. w.r. 643 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 246 03.09.21 09:05 Сейчас в теме
(1) sender.py процессор не напрягает? Может стоит sleep() внутрь цикла вставить?
Оставьте свое сообщение