Как запускать процессы bpm'online через веб-сервис
Glossary Item Box
Общие сведения
Для запуска бизнес-процессов из сторонних приложений предназначен web-сервис ProcessEngineService.svc. Основные возможности web-сервиса ProcessEngineService.svc описаны в статье "Web-сервис ProcessEngineService.svc".
Описание примера
Из строки навигации браузера или из пользовательского приложения запустить демонстрационные бизнес-процессы создания и считывания контактов bpm'online, используя web-сервис ProcessEngineService.svc.
Последовательность реализации примера
Для реализации примера необходимо:
1. Создать демонстрационные процессы добавления нового контакта и считывания всех контактов.
2. Проверить работоспособность web-сервиса ProcessEngineService.svc из строки навигации Web-браузера.
3. В пользовательском приложении создать класс, в котором реализовать логику работы с веб-сервисом ProcessEngineServise.svc.
1. Создание демонстрационных бизнес-процессов
К СВЕДЕНИЮ
Особенности и лучшие практики создания бизнес-процессов в bpm'online подробно описаны в документации по настройке процессов.
1.1. Создание процесса добавления контакта
Бизнес-процесс добавления нового контакта, кроме сигналов старта и завершения, содержит всего один элемент — [Задание-сценарий] ([ScriptTask]), в котором реализуется логика добавления контакта в систему. Значения свойств бизнес-процесса (рис. 1):
- [Название] — "Add New External Contact".
- [Код] ([Code]) — "UsrAddNewExternalContact".
Для остальных свойств используются значения по умолчанию.
Рис. 1. — Свойства бизнес-процесса UsrAddNewExternalContact
Бизнес-процесс содержит два текстовых параметра (рис. 2), через которые в процесс передаются реквизиты контакта:
- ContactName — содержит имя добавляемого контакта.
- ContactPhone — содержит телефон добавляемого контакта.
Рис. 2. — Параметры бизнес-процесса
Логика добавления нового контакта в систему реализуется в элементе [Задание-сценарий] ([ScriptTask]). Значения свойств элемента (рис. 3):
- [Название] — "Add contact".
- [Код] ([Code]) — "ScriptTaskAddContact".
- [Для интерпретируемого процесса] ([For interpreted process]) — признак снят.
Рис. 3. — Свойства элемента [Задание-сценарий] ([ScriptTask])
Исходный код, который должен содержать элемент ScriptTaskAddContact:
// Создание экземпляра схемы объекта "Контакт". var schema = UserConnection.EntitySchemaManager.GetInstanceByName("Contact"); // Создание экземпляра нового объекта. var entity = schema.CreateEntity(UserConnection); // Установка значений по умолчанию для колонок объекта. entity.SetDefColumnValues(); // Установка значения колонки "Name" из параметра процесса. entity.SetColumnValue("Name", ContactName); // Установка значения колонки "Phone" из параметра процесса. entity.SetColumnValue("Phone", ContactPhone); // Сохранение нового контакта. entity.Save(); return true;
После внесения изменений бизнес-процесс необходимо сохранить.
Создание процесса чтения контактов
Бизнес-процесс, формирующий список всех контактов, также содержит один элемент [Задание-сценарий] ([ScriptTask]), в котором реализуется необходимая логика. Значения свойств бизнес-процесса (рис. 4):
- [Название] — "Get All Contacts".
- [Код] ([Code]) — "UsrGetAllContacts".
- [Компилировать] ([Force compile]) — признак установлен.
Для остальных свойств используются значения по умолчанию.
Рис. 4. — Свойства бизнес-процесса чтения контактов
Процесс UsrGetAllContacts содержит единственный параметр ContactList, через который процесс будет возвращать список всех контактов системы в виде JSON-объекта. Тип параметра — строка неограниченной длины. Свойства параметра отображены на рис. 5.
Рис. 5. — Свойства параметра
Логика выборки контактов реализована в элементе процесса [Задание-сценарий] ([ScriptTask]). Значения свойств элемента (рис. 6):
- [Название] — "Get all contacts".
- [Код] ([Code]) — "ScriptTaskGetAllContacts".
- [Для интерпретируемого процесса] ([For interpreted process]) — признак снят.
Рис. 6. — Свойства элемента [Задание-сценарий] ([ScriptTask])
Исходный код, который должен содержать элемент ScriptTaskGetAllContacts:
// Создание экземпляра EntitySchemaQuery. EntitySchemaQuery query = new EntitySchemaQuery(UserConnection.EntitySchemaManager, "Contact"); // Признак для обязательного выбора первичной колонки (Id). query.PrimaryQueryColumn.IsAlwaysSelect = true; // Добавление в запрос колонок. query.AddColumn("Name"); query.AddColumn("Phone"); // Получение результирующей коллекции. var entities = query.GetEntityCollection(UserConnection); // Формирование списка контактов для сериализации в JSON. List<object> contacts = new List<object>(); foreach (var item in entities) { var contact = new { Id = item.GetTypedColumnValue<Guid>("Id"), Name = item.GetTypedColumnValue<string>("Name"), Phone = item.GetTypedColumnValue<string>("Phone") }; contacts.Add(contact); } // Сохранение сериализованной в JSON коллекции контактов в параметр ContactList. ContactList = JsonConvert.SerializeObject(contacts); return true;
После внесения изменений бизнес-процесс необходимо сохранить.
2. Запустить выполнение бизнес-процессов из строки навигации Web-браузера
Поскольку вызов метода сервиса возможен с помощью HTTP GET-запроса, то для выполнения запуска бизнес-процесса можно использовать обычный Web-браузер. Общие форматы URL вызова сервиса для бизнес-процессов с параметрами приведены в статье "Web-сервис ProcessEngineService.svc".
Для запуска процесса создания нового контакта необходимо в строку навигации браузера ввести следующий URL:
http[s]://<адрес_приложения_bpm'online>/0/ServiceModel/ProcessEngineService.svc/UsrAddNewExternalContact/Execute?ContactName=John Johanson&ContactPhone=+1 111 111 1111
После перехода по указанному URL, bpm'online будет добавлен новый контакт (рис. 7).
Рис. 7. — Новый контакт
ВАЖНО
Новый контакт будет создан при каждом успешном запросе к сервису. Если выполнить несколько запросов с одинаковыми параметрами, будет создано несколько контактов-дублей.
Для запуска процесса чтения всех контактов необходимо в строку навигации браузера ввести следующий URL:
http[s]://<адрес_приложения_bpm'online>/0/ServiceModel/ProcessEngineService.svc/UsrGetAllContacts/Execute?ResultParameterName=ContactList
После выполнения перехода по указанному URL, в окне браузера будет отображен JSON-объект, содержащий коллекцию контактов (рис. 8).
Рис. 8. — Результат выполнения процесса чтения контактов
3. Запустить выполнение бизнес-процессов из пользовательского приложения
Прежде чем выполнять запросы к сервису ProcessEngineService.svc, необходимо выполнить аутентификацию. Для этого предназначен сервис аутентификации AuthService.svc. Пример выполнения аутентификации из пользовательского консольного приложения приведен в статье "Сервис аутентификации AuthService.svc". Консольное приложение, созданное по приведенному примеру, можно взять за основу для примера, приведенного ниже.
ВАЖНО
Полностью исходный код консольного пользовательского приложения, предназначенного для запуска бизнес-процессов с помощью сервиса ProcessEngineService.svc, доступен на GitHub по ссылке https://github.com/bpmonline-academy/DevelopmentGuide/tree/master/Examples/WorkWithBpmByWebServices.
Для формирования запросов к сервису ProcessEngineService.svc в исходный код класса Program нужно добавить строковое поле, содержащее базовый URL сервиса:
private const string processServiceUri = baseUri + @"/0/ServiceModel/ProcessEngineService.svc/";
Для выполнения запуска бизнес-процесса добавления контакта необходимо в исходный код класса Program добавить следующий метод:
public static void AddContact(string contactName, string contactPhone) { // Формирование URL запроса. string requestString = string.Format(processServiceUri + "UsrAddNewExternalContact/Execute?ContactName={0}&ContactPhone={1}", contactName, contactPhone); // Создание Http-запроса. HttpWebRequest request = HttpWebRequest.Create(requestString) as HttpWebRequest; request.Method = "GET"; request.CookieContainer = AuthCookie; // Выполнение запроса и анализ Http-ответа. using (var response = request.GetResponse()) { // Поскольку сервис вернет пустую строку, // то можно вывести свойства http-ответа. Console.WriteLine(response.ContentLength); Console.WriteLine(response.Headers.Count); } }
Также необходимо добавить метод запуска процесса чтения контактов:
public static void GetAllContacts() { // Формирование URL запроса. string requestString = processServiceUri + "UsrGetAllContacts/Execute?ResultParameterName=ContactList"; HttpWebRequest request = HttpWebRequest.Create(requestString) as HttpWebRequest; request.Method = "GET"; request.CookieContainer = AuthCookie; // Создание Http-запроса. using (var response = request.GetResponse()) { // Выполнение запроса и вывод результата. using (var reader = new StreamReader(response.GetResponseStream())) { string responseText = reader.ReadToEnd(); Console.WriteLine(responseText); } } }
Вызов добавленных методов можно осуществить, например, в главном методе программы после успешной аутентификации:
static void Main(string[] args) { if (!TryLogin("Supervisor", "Supervisor")) { Console.WriteLine("Wrong login or password. Application will be terminated."); } else { try { // Вызов методов запуска бизнес-процессов. AddContact("John Johanson", "+1 111 111 1111"); GetAllContacts(); } catch (Exception) { // Обработка исключений. throw; } }; Console.WriteLine("Press ENTER to exit..."); Console.ReadLine(); }
Результат выполнения программы представлен на рис. 9.
Рис. 9. — Результат выполнения пользовательского приложения