Создание действия для Flow
При необходимости интеграций со сторонними системами методами, которые отсутствуют в стандартном наборе Accelera, у вас есть возможность создать собственное действие.
Его задача - принять данные от Accelera и выполнить алгоритм для вашей задачи (например, запрос в одну из систем вашей компании или отправка PUSH-уведомления).
Любое действие является stateless, то есть выполняется асинхронно, без сохранения состояния клиента.
Вы можете создать собственное действие на любом подходящем для вас языке программирования. Главное требование - возможность подключения к RabbitMQ версии > 3.5.0, RabbitMQ имеет множество клиентских библиотек.
Определение действия
Для начала определите алгоритм вашего действия, рекомендуется планировать минимальный набор шагов и оптимизировать их для обеспечения наилучшего быстродействия.
Регистрация действия
При запуске процесса с вашим действием его необходимо зарегистрировать в системе Accelera. Для этого определите метаданные вашего действия в JSON-формате:
let meta = {
title: "My action",
name: "mybestaction",
class: "stateless-action",
icon: "<svg width=\"18\" height=\"18\" class=\"fe\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n" +
"<path d=\"M14 20C14 21.1046 13.1046 22 12 22C10.8954 22 10 21.1046 10 20M14 20C14 18.8954 13.1046 18 12 18M14 20H21M10 20C10 18.8954 10.8954 18 12 18M10 20H3M12 18V14M21 5C21 6.65685 16.9706 8 12 8C7.02944 8 3 6.65685 3 5M21 5C21 3.34315 16.9706 2 12 2C7.02944 2 3 3.34315 3 5M21 5V11C21 12.66 17 14 12 14M3 5V11C3 12.66 7 14 12 14\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path>\n" +
"</svg>",
inputs: 1,
outputs: 0,
data: {
svgIcon: true,
isCustom: true,
isCustomJS: false,
isCustomHTML: false,
param1: "",
param2: "",
param3: "",
param4: [],
paramEditor: ""
},
paramsDescription: [
{
name: "param1",
value: "Первый параметр",
},
{
name: "param2",
value: "Второй параметр",
type: "dropdown",
options: ["1", "2"]
},
{
name: "param3",
value: "Третий параметр",
type: "constant",
constant: "3"
},
{
name: "paramEditor",
value: "Поле для верстки текста",
type: "textEditor"
},
{
name: "param4",
value: "Четвертый параметр",
type: "dynamicList",
fields: [
{
name: "dynamic_number",
type: "number"
},
{
name: "dynamic_multidropdown",
type: "multiDropdown",
options: [
{name: "Параметр 5", value: "item5"},
{name: "Параметр 6", value: "item6"}
]
}
]
}
]
};**title**- Короткое описание действия для отображения в GUI.**name**- Название действия, используйте только латиницу, без цифр, вместо пробелов укажите дефис. Данное имя должно быть уникальным для каждого действия.**class**- Должен быть всегда stateless-action.**inputs**- Всегда значение 1.**outputs**- Всегда значение 0.html- html для отображения ноды действия в GUI. (если**isCustomHTML**-true).svgIcon- html иконки ноды действия для отображения в GUI. (если**svgIcon**-true).**data**- набор параметров действия. Перечислите названия параметров как в примере. Значения будут заполнены в GUI при настройке действия в сценарии.**svgIcon**-true, если используется иконка из поляiconдля отображения в GUI.**isCustomJS**- если значение
true, то экшен имеет JS скрипт, который позволяет кастомизировать состав полей для параметров действия. С помощью скрипта также возможно реализовывать различные алгоритмы работы с данными в рамках действия. - если значение
false, то поля отображаются согласно описанию параметров в**paramsDescription**.
- если значение
**isCustomHTML**- данный параметр позволяет кастомизировать отображение экшена в сценарии. Если значение параметра true, то используется верстка из поляhtml, еслиfalse, то действие отображается в GUI по умолчанию.
💡
Обязательно укажите параметр isCustom: true, иначе ваши действия будут проигнорированы.
**paramsDescription** - Описания параметров для правильного отображения в GUI.
name- название параметра, можно использовать только латиницу, цифры, дефис-и нижнее подчеркивание_. Данное имя должно быть уникальным для каждого параметра.value- описание параметра, которое отобразится в GUI.type- тип поля. Если параметрtypeотсутствует, то отобразится поле типа text.
Для некоторых полей необходимы дополнительные настройки (см. таблицу Типы полей).
Типы полей.
| Тип | Описание | Дополнительные параметры |
|---|---|---|
| input | Обычное текстовое поле | - |
| inputTable | Поле для названия таблицы. Нельзя начинать с цифры, запрещены пробелы и символы кроме _ | - |
| multiDropdown | Принимает массив параметров, выбирается несколько опций. | options - содержит массив с вариантами значений.Можно задать с помощью строковых значений или в форме объекта, где name - описание опции (отображается в GUI), а value - значение (должно быть уникально для каждой опции).Пример: ["1", "2"] или[{name: "Параметр 1", value: "1"}, {name: "Параметр 2", value: "2"}] |
| constant | Неизменяемое поле | constant- значение неизменяемого поле в формате строки.Пример: "строка" |
| dropdown | Принимает массив параметров, выбирается одна опция. | options - содержит массив с вариантами значений.Можно задать с помощью строковых значений или в форме объекта, где name - описание опции (отображается в GUI), а value - значение (должно быть уникально для каждой опции).Пример: ["1", "2"] или[{name: "Параметр 1", value: "1"}, {name: "Параметр 2", value: "2"}] |
| number | Поле для ввода чисел | - |
| text | Текстовое поле, которое можно расширять | - |
| textEditor | Текстовый редактор (based on Article) | - |
| dynamicList | Динамический список атрибут | fields- содержит массив с описаниями параметров, которые будут отображаться в рамках динамического списка.Для динамического списка атрибут доступны все типы параметров из данной таблицы, кроме самого dynamicListПример: [{name: "dynamic_number", type: "number"},\n{name: "dynamic_multidropdown",\ntype: "multiDropdown",\noptions: [{name: "Параметр 5", value: "5"},\n{name: "Параметр 6", value: "6"}]}]\n |
| calendar | Поле календаря | - |
Далее зарегистрируйте экшн, отправив этот JSON в очередь FLOWS.flows-custom-actions-register.
Система Accelera Flows получит данные о новом действии и отобразит его в GUI при настройке сценария.
Получение данных от Accelera
После регистрации вашего действия пока ваш процесс запущен он должен получать данные от системы Accelera и выполнять запрограммированные действия. Система передает данные о действиях через RabbitMQ. Для получения данных процессу требуется совершить ряд действий:
channel.assertExchange('ex-custom-actions', 'fanout', { durable: true }),
channel.assertQueue('my-custom-actions', { durable: true }),
channel.bindQueue('my-custom-actions', 'ex-custom-actions'),
channel.prefetch(1),
channel.consume('my-custom-actions', (message) => {
// Do something with message
channel.ack(message);
});1. Определить обмен с названием 'ex-custom-actions' типа fanout.
2. Создать очередь с именем, которое вам подходит. Например 'my-custom-actions'.
3. Связать очередь с обменом командой bindQueue.
4. Установить параметр
prefetch = 1.
5. Запустить потребление очереди.
В объекте message вы получите новое сообщение, которое содержит:
1. Id клиента.
2. Название события.
3. Строковое представление JSON-объекта метаданных с заполненными параметрами блока data.
4. Контекст события.
5. Название сценария.
6. Идентификатор сценария.
Пример сообщения от Accelera:
{
id: '123', // id клиента
event: 'event2', // событие, на которое был вызван экшн
action: {
id: 5, // номер блока в сценарии
name: 'sendsay', // имя экшна
data: { // массив параметров, заполненных в настройке
svgIcon: true,
isCustom: true,
isCustomJS: false,
isCustomHTML: false,
param1: "",
param2: "",
param3: "",
param4: []
},
class: 'stateless-action', // далее технические поля экшна
html: '<div>...</div>',
typenode: false,
inputs: { input_1: [Object] },
outputs: {},
pos_x: 544.6666463216145,
pos_y: -124.58333333333337
},
context: { username: 'test' }, // параметры клиента в сценарии на момент вызова экшна
flow_name: 'test', // имя сценария, откуда был вызван экшн
flow_id: 'toyzb69857' // ID сценерия
}После считывания необходимо отправить подтверждение командой ack:
channel.ack(message);Выполнив вышеперечисленные действия, ваш процесс получит все необходимые данные из сценария.
Если не отправить ack сообщение, то через некоторое время брокер посчитает потребителя нерабочим и передаст это сообщение на повторное выполнение в другой исполнитель (если такой существует).