Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 7 additions & 24 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,8 @@ on:
type: string

env:
VERSION: 2.2.0.${{github.run_number}}
LINUX_DIR: linux/build
VERSION: 2.3.0.${{github.run_number}}
LINUX_DIR: linux/
LINUX_LIB: libPinkRabbitMQ64.so
PKG_DIR: package
WIN_DIR: windows
Expand All @@ -29,38 +29,22 @@ jobs:
buildLinux:
runs-on: ubuntu-22.04
name: Linux ${{inputs.postfix}}
services:
rabbitmq:
image: rabbitmq
ports:
- 5672:5672

steps:
- uses: actions/[email protected]

- run: mkdir $LINUX_DIR

- name: Configure CMake.
working-directory: ${{env.LINUX_DIR}}
run: cmake -DCMAKE_BUILD_TYPE=Release -DVERSION=${{env.VERSION}} -DNAME_POSTFIX=${{inputs.postfix}} ..

- name: Build
working-directory: ${{env.LINUX_DIR}}
run: cmake --build .

- if: ${{ inputs.postfix == '' }}
run: python3 -m pip install pytest
run: docker compose run --rm prmq-build Debug
working-directory: ${{env.LINUX_DIR}}

- name: Test
if: ${{ inputs.postfix == '' }}
- run: docker compose run --rm prmq-build Release ${{env.VERSION}} ${{inputs.postfix}}
working-directory: ${{env.LINUX_DIR}}
run: ctest . -V

- name: Upload Linux Library
uses: actions/[email protected]
with:
name: ${{env.LINUX_LIB}}_${{inputs.postfix}}
path: ${{env.LINUX_DIR}}/${{env.LINUX_LIB}}
path: ${{env.LINUX_DIR}}/tmp/${{env.LINUX_LIB}}
if-no-files-found: error
retention-days: 1

Expand All @@ -86,7 +70,7 @@ jobs:

- name: Add MSBuild to PATH
uses: microsoft/setup-msbuild@v2

- name: Build
working-directory: ${{env.WIN_DIR}}
run: msbuild msbuild.xml -t:makeRelease -p:VERSION=${{env.VERSION}} -p:NAME_POSTFIX=${{inputs.postfix}}
Expand All @@ -111,4 +95,3 @@ jobs:
${{ github.event.head_commit.message }}

[Лог сборки](https://github.com/${{github.repository}}/actions/runs/${{github.run_id}})

7 changes: 5 additions & 2 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
# Новое в версии 2.3
* Добавлен новый метод BatchPublish.

# Новое в версии 2.2
* Обновлены библиотеки POCO и AMQP-CPP.
* Добавлена поддержка TLS 1.3
Expand Down Expand Up @@ -27,7 +30,7 @@
* Исправлена ошибка отправки сообщений > 10 мб методом BasicPublish
* Исправлена ошибка - Десктопная компонента зависает при вводе правильного сервера, но неправильного логина
# Новое в версии 1.8
* Добавлена поддержка 64 битных Linux систем.
* Добавлена поддержка 64 битных Linux систем.
* Внешняя компонента для Linux входит в общий zip макет компоненты, но по сути является отдельный sln проектом. Однако протокол AMQP реализован через ту же самую библиотеку - AMQP-CPP, как и для Windows. Обмен TCP с сервером RAbbitMQ реализован через новую библиотеку libevent
* Скорость отправки сообщений для Linux компоненты отличается от Windows компоненты и составляет на отправку - 1000 8кб сообщений/сек и на получение - 4000 8кб сообщений/сек (для Windows - 30 и 1000 8кб сообщений/сек соответственно)

Expand All @@ -41,7 +44,7 @@
* Добавлены новый параметр messageTag в методы BasicConsumeMessage, BasickAck, BasicNack.
* Исправлена ошибка зависания компоненты, если неправильно указаны параметры авторизации к серверу RabbitMQ (логин, пароль или vhost)
* Добавлена поддержка свойства сообщения priority (метод SetPriority)
* Реализован параметр persistent для метода basicPublish
* Реализован параметр persistent для метода basicPublish

# Новое в версии 1.5

Expand Down
77 changes: 51 additions & 26 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,12 +20,12 @@

## API
Компонента реализует протокол [AMQP 0.9.1](https://www.rabbitmq.com/resources/specs/amqp0-9-1.pdf).
Компонента имеет ряд методов для работы из встроенного языка 1С. Параметры с тегом [НЕ РЕАЛИЗОВАНО] имеют пустую реализацию, но передавать их все равно требуется. Параметры с тегом [НЕОБЯЗАТЕЛЬНЫЙ] можно не передавать.
Компонента имеет ряд методов для работы из встроенного языка 1С. Параметры с тегом [НЕ РЕАЛИЗОВАНО] имеют пустую реализацию, но передавать их все равно требуется. Параметры с тегом [НЕОБЯЗАТЕЛЬНЫЙ] можно не передавать.

### Список свойств комоненты, связанных с сообщением:

* correlationId - строка, чтение и запись
* messageId - строка, чтение и запись
* CorrelationId - строка, чтение и запись
* MessageId - строка, чтение и запись
* Type - строка, чтение и запись
* AppId - строка, чтение и запись
* ContentEncoding - строка, чтение и запись
Expand All @@ -43,7 +43,7 @@

### Список методов:

<b>Connect</b> - устанавливает соединение с сервером RabbitMQ. Таймаут - 5 секунд. Если в течение этого времени сервер недоступен, а также указаны неверные логин, пароль или vhost, то будет возвращена ошибка, которая может быть получена через метод GetLastError.
<b>Connect</b> - устанавливает соединение с сервером RabbitMQ. Таймаут - 5 секунд. Если в течение этого времени сервер недоступен, а также указаны неверные логин, пароль или vhost, то будет возвращена ошибка, которая может быть получена через метод GetLastError.

Параметры:
* host - Строка - Адрес сервера RabbitMQ
Expand All @@ -52,7 +52,7 @@
* pwd - Строка - Пароль пользователя
* vhost - Строка - Vhost пользователя
* pingRate - Число - [НЕ РЕАЛИЗОВАНО][НЕОБЯЗАТЕЛЬНЫЙ]. Частота пульса
* secure - Булево - [НЕОБЯЗАТЕЛЬНЫЙ] использовать защищенное соединение по протоколу TLS 1.2. По-умолчанию Ложь. Если Истина, то нужно также передавать соответствующий порт для amqps соединения
* secure - Булево - [НЕОБЯЗАТЕЛЬНЫЙ] использовать защищенное соединение по протоколу TLS 1.2. По-умолчанию Ложь. Если Истина, то нужно также передавать соответствующий порт для amqps соединения
* timeout - Число - [НЕОБЯЗАТЕЛЬНЫЙ] время ожидания ответа на команды от сервера в секундах. По-умолчанию 5

<b>DeclareExchange</b> - Объявить точку обмена
Expand Down Expand Up @@ -89,23 +89,23 @@

Параметры:
* name - Строка - Имя очереди
* onlyIfIdle - Булево - Удаление будет выполнено, только если очередь не используется
* onlyIfIdle - Булево - Удаление будет выполнено, только если очередь не используется
* onlyIfEmpty - Булево - Удаление будет выполнено, только если очередь пуста

<b>BindQueue</b> - Установить связь очереди. Создает маршрут от точки обмена до очереди.

Параметры:
* queue - Строка - Имя очереди
* exchange - Строка - Имя точки обмена
* routingKey - Строка - Rлюч маршрутизации.
* routingKey - Строка - Rлюч маршрутизации.
* arguments - Строка - [НЕОБЯЗАТЕЛЬНЫЙ] произвольные свойства в формате Json-объект. Пример: `{"x-match": "all"}`.

<b>UnbindQueue</b> - Отсоединяет очередь от точки обмена.

Параметры:
* queue - Строка - Имя очереди
* exchange - Строка - Имя точки обмена
* routingKey - Строка - Rлюч маршрутизации.
* routingKey - Строка - Rлюч маршрутизации.

<b>BasicPublish</b> - Отправить сообщение

Expand All @@ -117,6 +117,31 @@
* persist - Булево - Сбрасывать сообщение на диск
* arguments - Строка - [НЕОБЯЗАТЕЛЬНЫЙ] произвольные свойства в формате Json-объект. Пример: `{"x-message-ttl": 60000}`.

<b>BatchPublish</b> - Отправить пакет сообщений

Параметры:
* exchange - Строка - Имя точки в которую отправляется сообщение
* persist - Булево - Сбрасывать сообщение на диск
* messages - Строка - массив сообщений в формате Json-объект. Пример:
```json
[
{
"routingKey": "routingkey1",
"body": "Message 1 body",
"properties":{
"MessageId": "761b5d1f-2f54-4f13-bdc3-9bfc35150616",
"AppId": "example"
}
},
{
"routingKey": "routingkey2",
"body": "Message 2 body",
"headers":{
"x-message-ttl": 60000
}
}
]
```

<b>BasicAck</b> Отсылает серверу подтверждение (ack), что сообщение обработано и его можно удалить. Подтвердить можно любое прочитанное сообщение.

Expand All @@ -134,7 +159,7 @@
* queue - Строка - Очередь из которой будем читать сообщения.
* consumerId - Строка - [НЕ РЕАЛИЗОВАНО] имя потребителя. Если не задан, то имя потребителя сгенерирует сервер и вернет из метода
* noConfirm - Булево - не ждать подтверждения обработки. Сообщения будут удалены из очереди сразу после отправки на клиента.
* exclusive - Булево - монопольно захватить очередь
* exclusive - Булево - монопольно захватить очередь
* selectSize - Число - количество единовременно считываемых сообщений из очереди в кеш компоненты. Оптимизационный параметр, который влияет на скорость забора сообщений. Рекомендуемый диапазон 100-1000. Нежелательно устанавливать слишком высокие значения, т.к. чтение большого числа накопленных сообщений в очереди может спровоцировать нехватку памяти на клиенте 1С и падение компоненты без вызова исключения.
* arguments - Строка - [НЕОБЯЗАТЕЛЬНЫЙ] произвольные свойства в формате Json-объект. Пример: `{"x-stream-offset": "first"}`.

Expand Down Expand Up @@ -199,7 +224,7 @@

Параметры:
* timeout - число - время остановки в милисекундах


## Правила работы с компонентой из 1С
1. Завершать работу с компонентой посредством обнуления объекта компоненты. Например:
Expand All @@ -219,7 +244,7 @@
// Работа с компонентой
// ...
//
ТекстСообщения = "";
ТекстСообщения = "";
ТегСообщения = 0; // при каждой итерации очищаем память по указателю, который неявной хранится в этой переменной
КонецЦикла;
```
Expand Down Expand Up @@ -281,11 +306,11 @@
ОтправляемоеСообщение = "Test";
ОтветноеСообщение = "";
ТегСообщения = 0;

УстановитьВнешнююКомпоненту("ОбщийМакет.PinkRabbitMQ");
ПодключитьВнешнююКомпоненту("ОбщийМакет.PinkRabbitMQ", "BITERP", ТипВнешнейКомпоненты.Native);
Клиент = Новый("AddIn.BITERP.PinkRabbitMQ");

Клиент.Connect("127.0.0.1", 5672, "user", "password", "vhost");
Клиент.DeclareQueue(ИмяОчереди, Ложь, Ложь, Ложь, Ложь);
Клиент.BasicPublish("", ИмяОчереди, ОтправляемоеСообщение, 0, Ложь);
Expand Down Expand Up @@ -318,27 +343,27 @@

Вместе с проектом поставляются заранее скомпилированные зависимости в папке libsPrecompiled для 32 и 64 битных платформ в вариантах debug и release. Поэтому для создания окружения разработки нужно сделать только следующее:

1. Установить Visual Studio 2019 (можно Community). При установке выбрать среди обязательных компонентов также WIndows SDK 10
2. Скачать исходники репозитория данного проекта.
3. Запустить файл проекта AddIn.sln в корневом каталоге
1. Установить Visual Studio 2019 (можно Community). При установке выбрать среди обязательных компонентов также WIndows SDK 10
2. Скачать исходники репозитория данного проекта.
3. Запустить файл проекта AddIn.sln в корневом каталоге

## Разворачивание окружения разработки на Windows 10 и самостоятельная компиляция всех зависимостей (Не рекомендуется)

Порядок изложенный ниже требуется, если нужно с нуля собрать весь проект и скомпилировать все зависимые билиотеки. Если это не требуется, то рекомендуется следовать простому порядку разворачивания окружения, приведенному выше.

1. Установить Visual Studio 2019 (можно Community). При установке выбрать среди обязательных компонентов также WIndows SDK 10
2. Скачать исходники репозиторий данного проекта.
1. Установить Visual Studio 2019 (можно Community). При установке выбрать среди обязательных компонентов также WIndows SDK 10
2. Скачать исходники репозиторий данного проекта.
3. Скачать исходники либы для работы с протоколом раббита AMQP-CPP 4.1.4. https://github.com/CopernicaMarketingSoftware/AMQP-CPP в папку libs
4. Скомпилировать дебажную и релизную dll в папкe libs\AMQP-CPP-4.1.4\build с помощью cmake.
4. Скомпилировать дебажную и релизную dll в папкe libs\AMQP-CPP-4.1.4\build с помощью cmake.
```
mkdir build
cd build
cmake ..
cmake ..
cd ..
cmake --build
```
Для компиляции 64-битной release версии либы
* Открыть файл проекта amqpcpp.sln
* Открыть файл проекта amqpcpp.sln
* Выбрать свойства проекта amqcpp => C/C++ => Code generation => Runtime library => Multi-threaded (/MT)
* Скомпилировать проект Release

Expand All @@ -354,10 +379,10 @@ cmake --build
- ..\libs\poco-poco-1.9.0-release\Foundation\include;
- ..\libs\poco-poco-1.9.0-release\Net\include;
- ..\libs\AMQP-CPP-4.1.4\include;
11. Проверить линковку зависимостей для папок lib и dll файлов Properties узла проекта -> Linker -> General -> Additional include directories
11. Проверить линковку зависимостей для папок lib и dll файлов Properties узла проекта -> Linker -> General -> Additional include directories
- ..\libs\poco-poco-1.9.0-release\lib64;
- ..\libs\AMQP-CPP-4.1.4\build\bin\Debug\;
12. Проверить линкову для lib файлов зависимостей Properties узла проекта -> Linker -> Input -> Additional dependencies
12. Проверить линкову для lib файлов зависимостей Properties узла проекта -> Linker -> Input -> Additional dependencies
- amqpcpp.lib;
- PocoFoundationd.lib;
13. Скомпилировать компоненту через проект
Expand All @@ -371,13 +396,13 @@ cmake --build
```
mkdir build
cd build
cmake ..
cmake ..
cmake --build . --config Release
```

## Сборка проекта через Visual Studio для Linux

1. Запустить проект [PinrRabbitMQ для Linux](PinkRabbitMQLinux/PinkRabbitMQLinux.sln)
1. Запустить проект [PinrRabbitMQ для Linux](PinkRabbitMQLinux/PinkRabbitMQLinux.sln)
2. Открыть свойства проекта и в меню Confugartion properties -> General -> Configuration type выбрать Dynamic library (so)
3. Скомпилировать проект через f5
4. Либа будет скомпилирована в каталоге ~/projects/PinkRabbitMQLinux/bin/x64/debug/ удаленной машины
Expand All @@ -393,7 +418,7 @@ sudo apt install build-essential cmake
cd PinkRabbitMQLinux
mkdir build
cd build
cmake ..
cmake ..
cmake --build .
```

Expand Down
3 changes: 2 additions & 1 deletion linux/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -9,4 +9,5 @@ RUN python3 -m pip install pytest requests cryptography PyYAML

COPY build.sh /build.sh

ENTRYPOINT /bin/bash /build.sh
ENTRYPOINT ["/build.sh"]
CMD ["Debug"]
16 changes: 13 additions & 3 deletions linux/build.sh
Original file line number Diff line number Diff line change
@@ -1,9 +1,19 @@
#!/bin/bash

set -e

cd /PRMQ/linux
rm -r ./tmp | true
mkdir tmp
mkdir tmp
cd tmp
cmake -DCMAKE_BUILD_TYPE=Debug ..
echo build $1 $2 $3
if [ "$1" == "Debug" ]; then
cmake -DCMAKE_BUILD_TYPE=Debug ..
else
cmake -DCMAKE_BUILD_TYPE=Release -DVERSION=$2 -DNAME_POSTFIX=$3 ..
fi
cmake --build .
RMQ_HOST=rabbitmq ctest -V

if [ "$1" == "Debug" ]; then
RMQ_HOST=rabbitmq ctest -V
fi
Loading