WebServicesDeveloperGuide
Руководство по работе с веб-сервисами сервера
Версия 4.6.0
© 2015-2023, ООО "Процессные технологии"
# Описание веб–сервисов сервера
Запуск веб-сервисов происходит автоматически при запуске RunaWFE–сервера. Веб-сервисы физически находятся в wfe-service-4.X.X.jar.
В RunaWFE версии 4 API веб-сервисов и Java API унифицированы за исключением нескольких методов с сигнатурами, содержащими сложные структуры и карты (java.util.Map) из-за ограничений веб-сервисов.
Во всем документе для формирования конкретного адреса нужно заменить 4.X.X на реальный номер версии системы.
# Определение версии сервера
Для использования в УРЛ-ах сервисов требуется указывать версию сервера. Её можно получать по адресу http://host:port/wfe/version (аутентификация не требуется).
# Доступ к веб-сервисам
# WildFly10 и Jboss7
http://localhost:8080/wfe-service-4.X.X/НазваниеВебСервиса/НазваниеИнтерфейса?wsdl
Название и описание сервиса | Локальный WSDL | Ссылка на описание методов (операций) |
AuthenticationServiceBean
Сервис аутентификации пользователей |
WildFly и Jboss7 | Открыть файл
|
AuthorizationServiceBean
Сервис авторизации операций (проверка полномочий) |
WildFly и Jboss7 | Открыть файл
|
BotServiceBean
Сервис по управлению бот станциями, ботами и заданиями ботов |
WildFly и Jboss7 | Открыть файл
|
DefinitionServiceBean
Сервис управления определениями процессов |
WildFly и Jboss7 | Открыть файл
|
ExecutionServiceBean
Сервис управления процессами и контроля их исполнения |
WildFly и Jboss7 | Открыть файл
|
TaskServiceBean
Сервис по работе с заданиями |
WildFly и Jboss7 | Открыть файл
|
ExecutorServiceBean
Сервис по работе с исполнителями (пользователями и группами) |
WildFly и Jboss7 | Открыть файл
|
ProfileServiceBean
Сервис по работе с профилями пользователей |
WildFly и Jboss7 | Открыть файл
|
RelationServiceBean
Сервис по работе с отношениями |
WildFly и Jboss7 | Открыть файл
|
SystemServiceBean
Сервис содержит общие операции по работе с системой |
WildFly и Jboss7 | Открыть файл
|
ScriptingServiceBean
Сервис для удаленного выполнения скриптов на стороне сервера |
WildFly и Jboss7 | Открыть файл
|
SubstitutionServiceBean
Сервис по работе с правилами замещения и их критериями |
WildFly и Jboss7 | Открыть файл
|
BotInvokerServiceBean 4.2.0+
Сервис по управлению бот станцией (запуск, остановка, получение статуса) |
WildFly и Jboss7 | Открыть файл
|
ReportServiceBean
Сервис по работе с отчетами |
WildFly и Jboss7 | Открыть файл
|
DataSourceServiceBean
Сервис по работе с источниками данных |
WildFly и Jboss7 | Открыть файл
|
ChatServiceBean
Сервис по работе с чатом участников экземпляра бизнес-процесса |
WildFly и Jboss7 | Открыть файл
|
AuditServiceBean
Сервис по работе с логами системы и выполнения бизнес-процессов |
WildFly и Jboss7 | Открыть файл
|
# Работа с переменными 4.1.0+
В связи с реализацией сложных переменных работа с переменными была изменена (в части простых переменных тоже).
При операциях получения переменных заполнены следующие атрибуты:
Название | Значение |
name | название переменной |
scriptingName | название переменной для использования в скриптах |
format | формат определяет тип переменной
для простых переменных принимает одно из значений: (string, text, integer, double, bigdecimal, boolean, date, datetime, time, file) типы для работы с исполнителями характеризуются значениями: (executor, user, group) компонентные типы характеризуются значениями: (list(?), map(?, ?)) с указанием типа компонент вместо вопросов для пользовательских типов формируется описание на основании атрибутов в формате JSON |
value | значение переменной в формате JSON |
При операциях отправки переменных нужно заполнять только атрибуты name и value, остальные атрибуты будут взяты из определения процесса.
Значение типа file представляется в виде, где для представления массива байт data используется кодировка Base64:
{ "fileName": "test.txt", "contentType": "text/plain", "data": "IyEvdXNyL2Jpbi9lbnYgcHl0aG9uCgo=" }
Значение типа (executor, user, group) представляется в виде:
{ "id": 44, "name": "kermit", "fullName": "Kermit Alex" }
При отправке переменной заполнить можно только атрибут id или name.
# Примеры
# Вызов веб-сервисов из клиента на языке Java
Проект wfe-webservice-client создан для авто-генерации клиентской библиотеки на основе серверных сервисов. В нём же есть примеры использования.
Сборку проекта можно осуществить с помощью команды в проекте wfe-webservice-client.
mvn clean install -Dappserver=jboss7 -Dmaven.test.skip=true
Перед сборкой необходимо запустить сервер (используется утилита wsconsume).
Другим вариантом генерации классов, требуемых для взаимодействия с веб-сервисом из WSDL является Jboss-утилита wsconsume.bat(sh), которой можно воспользоваться. Также можно скачать уже сгенерированный набор классов с исходниками runawfe-ws-client.4.X.X.jar. После этого необходимо добавить классы в classpath и использовать их API.
# Получения списка заданий пользователя
Пример:
public static void main(String[] args) {
try {
AuthenticationAPI authenticationAPI = new AuthenticationWebService().getAuthenticationAPIPort();
User user = authenticationAPI.authenticateByLoginPassword("Administrator", "wf");
TaskAPI taskAPI = new TaskWebService().getTaskAPIPort();
List<WfTask> tasks = taskAPI.getTasks(user, null);
System.out.println("TASKS = " + tasks.size());
for (WfTask task : tasks) {
System.out.println(" Task " + task.getName() + " assigned to " + task.getOwner().getName());
}
} catch (Exception e) {
e.printStackTrace();
}
}
# Работа с сигналами
В RunaWFE 4.4.1 были добавлены команды для работы с сигналами.
boolean signalReceiverIsActiveWS(User user, Map<String, String> routingData) - проверка, может ли сигнал быть обработан немедленно (существует ли по крайней мере один соответствующий активный получатель CatchEventNode)
void sendSignalWS(User user, Map<String, String> routingData, Map<String, ?> payloadData, long ttlInSeconds) - отправка сигнала получателям (CatchEventNode)
Тестовый процесс с узлом ожидания сигнала, в свойствах маршрутизации processDefinitionName=${currentDefinitionName}.
Файл:Sample1655.par
Код проверяющий наличие активного получателя со свойствами маршрутизации "processDefinitionName"="sample1655-unknown" и "processDefinitionName"="sample1655". А также непосредственно отправка сигнала в ожидающий в БП "sample1655" узел.
public static void main(String[] args) {
try {
AuthenticationAPI authenticationAPI = new AuthenticationWebService().getAuthenticationAPIPort();
User user = authenticationAPI.authenticateByLoginPassword("Administrator", "wf");
ExecutionAPI executionAPI = new ExecutionWebService().getExecutionAPIPort();
{
List<StringKeyValue> routingData = new ArrayList<>();
routingData.add(create("processDefinitionName", "sample1655-unknown"));
System.out.println(executionAPI.signalReceiverIsActiveWS(user, routingData));
}
{
List<StringKeyValue> routingData = new ArrayList<>();
routingData.add(create("processDefinitionName", "sample1655"));
System.out.println(executionAPI.signalReceiverIsActiveWS(user, routingData));
}
{
List<StringKeyValue> routingData = new ArrayList<>();
routingData.add(create("processDefinitionName", "sample1655"));
List<StringKeyValue> payloadData = new ArrayList<>();
payloadData.add(create("stringValue", "sample"));
payloadData.add(create("datetimeValue", "17.02.2020 15:17:44"));
executionAPI.sendSignalWS(user, routingData, payloadData, 1);
}
} catch (Exception e) {
e.printStackTrace();
}
}
private static StringKeyValue create(String key, String value) {
StringKeyValue kv = new StringKeyValue();
kv.setKey(key);
kv.setValue(value);
return kv;
}
# Вызов веб-сервисов из клиента на языке Python
Используя библиотеку suds можно взаимодействовать с сервером посредством веб-сервисов.
Запуск процесса
import suds
authentication = suds.client.Client("http://localhost:8080/wfe-service-4.X.X/AuthenticationWebService/AuthenticationAPI?wsdl")
user = authentication.service.authenticateByLoginPassword("Administrator", "wf");
execution = suds.client.Client("http://localhost:8080/wfe-service-4.X.X/ExecutionWebService/ExecutionAPI?wsdl")
variable1 = execution.factory.create('{http://impl.service.wfe.runa.ru/}variable')
variable1.name="string"
variable1.value="Test"
variable2 = execution.factory.create('{http://impl.service.wfe.runa.ru/}variable')
variable2.name="date"
variable2.value="2012-01-01"
variable3 = execution.factory.create('{http://impl.service.wfe.runa.ru/}variable')
variable3.name="number"
variable3.value=2012
variable4 = execution.factory.create('{http://impl.service.wfe.runa.ru/}variable')
variable4.name="executor"
variable4.value="{\"id\":1}"
print execution.service.startProcessWS(user, "demo variables test", [variable1, variable2, variable3, variable4])
Получение формы узла определения БП (по идентификаторам определения БП и узла)
import suds
import base64
authentication = suds.client.Client("http://localhost:8080/wfe-service-4.X.X/AuthenticationWebService/AuthenticationAPI?wsdl")
user = authentication.service.authenticateByLoginPassword("Administrator", "wf");
definition = suds.client.Client("http://localhost:8080/wfe-service-4.X.X/DefinitionWebService/DefinitionAPI?wsdl")
execution = suds.client.Client("http://localhost:8080/wfe-service-4.X.X/ExecutionWebService/ExecutionAPI?wsdl")
processDefinition = definition.service.getLatestProcessDefinition(user, "demo variables test")
interaction = definition.service.getTaskNodeInteraction(user, processDefinition.id, "ID1")
print base64.b64decode(interaction.formData).decode("utf-8")
Получение списка определений переменных в определении процесса
import suds
import base64
authentication = suds.client.Client("http://localhost:8080/wfe-service-4.X.X/AuthenticationWebService/AuthenticationAPI?wsdl")
user = authentication.service.authenticateByLoginPassword("Administrator", "wf");
definition = suds.client.Client("http://localhost:8080/wfe-service-4.X.X/DefinitionWebService/DefinitionAPI?wsdl")
processDefinition = definition.service.getLatestProcessDefinition(user, "demo variables test")
variables = definition.service.getVariableDefinitionsWS(user, processDefinition.id)
print variables
Получение переменных процесса
import suds
import base64
authentication = suds.client.Client("http://localhost:8080/wfe-service-4.X.X/AuthenticationWebService/AuthenticationAPI?wsdl")
user = authentication.service.authenticateByLoginPassword("Administrator", "wf");
execution = suds.client.Client("http://localhost:8080/wfe-service-4.X.X/ExecutionWebService/ExecutionAPI?wsdl")
print execution.service.getVariablesWS(user, 46)
Обновление переменных процесса
import suds
import base64
authentication = suds.client.Client("http://localhost:8080/wfe-service-4.X.X/AuthenticationWebService/AuthenticationAPI?wsdl")
user = authentication.service.authenticateByLoginPassword("Administrator", "wf");
execution = suds.client.Client("http://localhost:8080/wfe-service-4.X.X/ExecutionWebService/ExecutionAPI?wsdl")
variable = execution.factory.create('{http://impl.service.wfe.runa.ru/}variable')
variable.name = "editors"
variable.value = "[\"Scaners\", \"Ports\", \"Enumerators\"]"
print execution.service.updateVariablesWS(user, 46, variable)