Руководство прикладного разработчика#
Системные требования#
Системные требования представлены в разделе «Системные требовния» документа Руководство по установке.
Подключение и конфигурирование#
Информация о способах подключения и конфигурирования USSX для промышленной среды приведена в документе Руководство по установке.
Настройка рабочего места разработчика#
Создание структуры каталогов#
Необходимо создать показанную следующую структуру каталогов:
D:\prog (базовый каталог с общим ПО)
orcl (Oracle Database или PSQL)
putty (Putty)
name (где name − наименование интегрированной среды разработки)
D:\work (базовый каталог разработки)
key (каталог)
prj (проекты)
prj\bosfor (проект USSX)
prj\aj (проект Application Journal)
env (окружение, необходимое для запуска и работы USSX)
env\nodejs (NodeJS)
Настройка переменных среды#
Так как пользователь не имеет прав администратора, то настраивать можно только переменные среды текущего пользователя. Для этого в Панели управления в разделе Учетные записи пользователей необходимо выбрать раздел Изменение переменных среды.
Необходимо создать следующие переменные:
USS_HOME — путь к каталогу с конфигурационными файлами;
USS_ENV — путь к каталогу, где располагается ПО для запуска и работы;
USS_PRJ — путь к каталогу с файлами проекта.
Далее необходимо дополнить пользовательскую переменную Path значением D:\work\env\nodejs.

Установка ПО#
Необходимо выполнить установку требуемого ПО, содержащегося в каталоге с дистрибутивами.
Установка СУБД#
Необходимо выполнить установку СУБД PSQL или СУБД Oracle Database.
Установка СУБД PSQL#
Процесс установки подробно описан в документации к компоненту Pangolin (PSQL) продукта Platform V Pangolin SE (PSQ).
Установка СУБД Oracle Database#
Необходимо выполнить установку Oracle Database версии 12c.
На время установки должна быть запущена служба «Сервер», которая по умолчанию отключена.
Установку имеет смысл выполнять под учетной записью пользователя. Для этого, войдя в систему под учетной записью администратора, нужно включить пользователя в локальные администраторы. Затем необходимо войти под учетной записью пользователя и запустить установку.

Установка Putty#
Если данное ПО не установлено, то необходимо выполнить установку Putty.
Для этого требуется из каталога с дистрибутивами распаковать архив putty.zip в папку D:\prog\putty.
Установка Node.JS#
Необходимо выполнить установку Node.JS. Для этого требуется из каталога с дистрибутивами распаковать архив nodejs.zip в папку D:\work\env\nodejs. Далее необходимо убедиться, что в значениях переменной среды Path присутствует путь nodejs.
Установка интегрированной среды разработки#
Если интегрированная среда разработки не установлена, то для установки требуется из каталога с дистрибутивами распаковать ее архив.
Настройка проекта#
Создание SSH-ключей#
Необходимо сгенерировать ключ с помощью Puttygen (кнопка generate в интерфейсе).

Приватный и публичный ключи необходимо сохранить в папке D:\work\key.
Настройка Gitlab CE#
Необходимо войти в управление учетной записью Gitlab CE и в разделе SSH keys добавить свой публичный ключ. Для этого необходимо нажать кнопку Add key, в открывшемся окне ввести ключ в поле Key.
Клонирование репозитория#
Для клонирования репозитория необходимо выполнить следующие действия:
Убедиться в наличии прав на репозиторий USSX.
Войти в Gitlab CE в репозиторий USSX и скопировать SSH-ссылку для клонирования репозитория.
Запустить интегрированную среду разработки и в пункте Check out from Version Control выбрать Git.

Клонировать проект, используя ранее скопированный URL и каталог расположения проекта D:\work\prj\bosfor.

Настройка локальных БД#
Установка JDBC драйверов#
Для установки JDBC драйверов необходимо распаковать из каталога с дистрибутивами архив jdbc-drivers.zip в папку с настройками интегрированной среды разработки, например, \config\jdbc-drivers.
Настройка подключения к СУБД в интегрированной среде разработки#
Для подключения к Oracle Database (PostgreSQL, PSQL) необходимо использовать значения параметров, как на рисунке, приведенном ниже (Data Source: orcl, пароль orcl):

Создание базы USSX#
Для создания базы USSX необходимо выполнить следующие действия:
Создать 2 папки: USS_T, USS_L в директории data в инсталляции БД.
Создать одноименные tablespaces.
Создать пользователя USS.
Дать пользователю права на чтение и запись.
Дать пользователю все гранты для тейблспейсов uss_t, uss_l.
В командной строке ОС (рекомендовано использование ОС Альт 8 СП) перейти в каталог [project_bosfor]\z_build\DB и выполнить следующую команду:
java -jar liquibase.jar
--classpath=pjdbc.jar
--driver=org.postgresql.Driver
--url=jdbc:postgresql://localhost:<значение>/postgres
--username=<значение>
--password=<значение>
--changeLogFile=./liquibase/changelog.xml
update
Создание базы Application Journal#
Для создания базы Application Journal необходимо выполнить следующие действия:
Распаковать архив aj.zip в каталог D:\work\prj\aj\db.
В командной строке ОС (например, Альт 8 СП) перейти в каталог, указанный в предыдущем шаге, и выполнить команду:
dbupdate
--classpath=pjdbc.jar
--driver=org.postgresql.Driver
--url=jdbc:postgresql://localhost:<значение>/postgres
--username=<значение>
update
Настройка параметров проекта#
Maven settings#
В настройках интегрированной среды разработки необходимо указать путь к проектному файлу settings.xml (находится в корневой папке проекта).

Run configuration#
Запуск приложения происходит силами Spring Boot с указанием следующих необходимых настроек в application-properties:
Убедиться в том, что если выбран Oracle, то PostgreSQL выключен.
Postgres.enabled=false (если выбран PostgreSQL − true)Проверить настройки подключения к БД.
Datasource.main.url=connectionString Datasource.main.user=login Datasource.main.password=pass Datasource.standin.url=connectionString Datasource.standin.user=login Datasource.standin.password=passУказать настройки для авторизации.
clipas.spas_server_url=url clipas.secret_key=key
Значения для параметров авторизации необходимо уточнять у администраторов компонента Объединенный сервис авторизации (ОСА) (AUTZ) продукта Platfrom V IAM SE (IAM).
Настройка плагина SonarQube для интегрированной среды разработки#
Код должен соответствовать требованиям SonarQube. SonarQube анализирует общее качество кода, ошибки высвечиваются при нарушении основных правил (например, дублирование кода или заведомо очевидные уязвимые места). Не должно быть критических и блокирующих замечаний. Для упрощения контроля необходимо установить плагин SonarQube. После установки его необходимо настроить для подключения к SonarQube и изменить отображение ошибок как на рисунках ниже:
Сборка и запуск#
Для сборки и запуска проекта необходимо выполнить следующие действия:
Собрать проект с помощью Maven. При этом необходимо установить параметры, указанные на изображении:

Запустить Run configuration ErrorProcessingApplication, UssApplication:

В браузере перейти по ссылке http://localhost:<значение>.
Миграция на текущую версию#
В каждой новой версии USSX требуется:
Обновить БД. Для обновления БД используется LiquiBase, запускающийся вручную (подробности в инструкции \DB\Readme.txt) либо преднастроенным шагом задания Jenkins установки приложения;
Обновить ролевую модель в компоненте Объединенный сервис авторизации (ОСА) (AUTZ) продукта Platfrom V IAM SE (IAM), файл из дистрибутива: \config\roleModel.xml;
Обновить модули USSX и ERRM: \modules;
Загрузить файл настроек обработки, файл из дистрибутива \doc*файл загрузки внутренних справочников.xlsx.
Если Разработчиком используется локальная установка, то требуется только обновить БД и скачать последнюю версию проекта из репозитория.
Разработка первого приложения с использованием USSX#
Вызов USSX для регистрации отклонения#
Для вызова USSX для регистрации отклонения используется API ErrorProcessing, метод registerError с вызовом по json-rpc.
Зависимость для MAVEN:
<dependency>
<groupId><значение></groupId>
<artifactId><значение></artifactId>
<version>{версия 4.7.5 и выше}</version>
</dependency>
Пример реализации вызова USSX для регистрации отклонения приведен ниже. В примере подключается API USSX и заполняется DTO ErrorInfoDto, далее вызывается метод registerError для передачи инцидента в USSX:
package com.sbt.uss.jsonrpc.controller;
import com.sbt.uss.errorprocessor.jsonrpc.api.ErrorProcessing;
import com.sbt.uss.errorprocessor.jsonrpc.dto.CorrectiveServiceDto;
import com.sbt.uss.errorprocessor.jsonrpc.dto.ErrorFieldDto;
import com.sbt.uss.errorprocessor.jsonrpc.dto.ErrorInfoDto;
import com.sbt.uss.errorprocessor.jsonrpc.dto.ProcessStatusDto;
import org.apache.commons.lang.RandomStringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.Date;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
@RestController
public class MMTController {
@Autowired
private ErrorProcessing errorProcessing;
@GetMapping("/json-rpc/simple")
public ProcessStatusDto testJsonRpc4GenerationSimple() {
ErrorInfoDto errorInfoDto = new ErrorInfoDto();
errorInfoDto.setBpmsProcessName("common_error_processing_job");
errorInfoDto.setClientName("Тест Тестов Тестович");
errorInfoDto.setErrorBusinessInfo("Истекло время ожидания от Автотранзакции");
errorInfoDto.setErrorTechnoInfo("Connection Timeout");
errorInfoDto.setOperDay(new Date());
errorInfoDto.setClientId(24234234234234L);
errorInfoDto.setDateTime(new Date());
errorInfoDto.setTimeZone("Europe/Moscow");
errorInfoDto.setNeedApprove(false);
errorInfoDto.setModuleFrom("Платформа");
errorInfoDto.setOperId("bbb");
errorInfoDto.setErrorCode("101");
errorInfoDto.setOperCode("1111111");
errorInfoDto.setServiceCode("SRV-T-SD-Seizure-4gen");
errorInfoDto.setServiceName("Тест1");
errorInfoDto.setInnerProcessName("DELAYED_CALL");
errorInfoDto.setServiceTypeCode("18080003");
errorInfoDto.setServiceTypeName("Расчетный Центр");
errorInfoDto.setProductTypeCode("");
errorInfoDto.setServiceId("643");
errorInfoDto.setSelectedCorrectiveServiceName("Корректирующий сценарий 1");
errorInfoDto.setTb("32");
errorInfoDto.setOsb(RandomStringUtils.randomNumeric(4));
errorInfoDto.setVsp(RandomStringUtils.randomNumeric(4));
Map<String, ErrorFieldDto> errorFieldDto = new LinkedHashMap<>();
ErrorFieldDto errorFieldDto;
errorFieldDto = new ErrorFieldDto();
errorFieldDto.setValue("1");
errorFieldDto.setRusName("Значение 1");
errorFieldDto.put("1", errorFieldMmt);
errorFieldDto = new ErrorFieldDto();
errorFieldDto.setValue("2");
errorFieldDto.setRusName("Значение 2");
errorFieldDto.put("2", errorFieldMmt);
errorFieldDto = new ErrorFieldDto();
errorFieldDto.setValue("3");
errorFieldDto.setRusName("Значение 3");
errorFieldDto.put("3", errorFieldMmt);
errorFieldDto = new ErrorFieldDto();
errorFieldDto.setValue("4");
errorFieldDto.setRusName("Значение 4");
errorFieldDto.put("4", errorFieldMmt);
errorFieldDto = new ErrorFieldDto();
errorFieldDto.setValue("0");
errorFieldDto.setRusName("Повторный вызов через (мс)");
errorFieldDto.put(ErrorInfoDto.DELAY, errorFieldMmt);
errorInfoDto.setErrorFieldMap(errorFieldMap);
CorrectiveServiceDto cs1 = new CorrectiveServiceDto();
cs1.setName("Корректирующий сценарий 1");
cs1.setMmtApiService("");
cs1.setMmtModule("url");
HashMap<String, CorrectiveServiceDto> correctiveServiceMmtHashMap = new HashMap<>();
correctiveServiceMmtHashMap.put("corServ1", cs1);
errorInfoDto.setCorrectiveServices(correctiveServiceMmtHashMap);
errorInfoDto.setSelectedCorrectiveServiceName("corServ1");
HashMap<String, String> operationContext = new HashMap<>();
operationContext.put("Кинем исключение", "aaaaa");
errorInfoDto.setOperationContextMap(operationContext);
System.out.println("Создание ошибки: " + errorInfoDto);
ProcessStatusDto response = errorProcessing.registerError(errorInfoDto);
System.out.println(response.getStatus());
System.out.println(response.getMessage());
System.out.println(response.getErrorID());
return response;
}
}
Реализация корректирующего сценария#
Реализация корректирующего сценария возможна в двух вариантах:
с использованием библиотеки mmt-lite - в этом случае корректирующий сценарий имплементирует метод runScenario(CorrectInfoDto correctInfoDto, @CallbackArg BiConsumer<CorrectStatusDto, Throwable> callback); и асинхронный ответ с результатом работы корректирующего сценария CorrectStatusDto возвращается методом callback.accept(correctStatusDto, null) через библиотеку mmt-lite;
без использования библиотеки mmt-lite - в этом случае корректирующий сценарий имплементирует метод runCorrectionScenario(CorrectInfoDto correctInfoDto); и возвращает асинхронный ответ с результатом работы корректирующего сценария CorrectStatusDto через вызов нотификации USSX NotifyCorScenarioResult(correctStatusDto). При этом библиотека mmt-lite не используется.
Реализация корректирующего сценария с использованием библиотеки mmt-lite#
Корректирующий сценарий с использованием библиотеки mmt-lite должен имплементировать API ErrorCorrection метод runScenario(CorrectInfoDto correctInfoDto, @CallbackArg BiConsumer<CorrectStatusDto, Throwable> callback) с аргументом-callback. При этом используется API ErrorCorrection версии 4.7.5 или выше.
Настройки для Maven:
<dependency>
<groupId>sbp.com.sbt.uss</groupId>
<artifactId>uss-orc-api</artifactId>
<version>{версия 4.7.5 и выше}</version>
</dependency>
Использоване библиотеки transport-lite-client (mmt-lite) версии 5.1.5.
Настройки для Maven:
<dependency>
<groupId>platform.core.transport</groupId>
<artifactId>transport-lite-client</artifactId>
<version>5.1.5</version>
</dependency>
Особенности реализации:
Вызов корректирующего сценария com.sbt.uss.common.jsonrpc.orc.api.ErrorCorrection/runScenario выполняется с лямбда-функцией для асинхронного ответа, поэтому вместо традиционного json–запроса из USSX отправляется бинарный запрос, который должен обрабатываться особым образом на стороне Synapse-Ingress корсценария.
Требуется использовать кастомный образ Synapse-Ingress (Envoy).
EnvoyFilter для бинарного запроса должен работать через sbt_auth, а не стандартный ext_auth и в with_request_body: должен быть установлен флаг pack_as_bytes: true.
Если используется ОТТS, то по умолчанию в приложение запрос поступает с ОТТ-сертификатами в заголовке. Поэтому следует либо настроить отбрасывание ОТТ-сертификатов, либо увеличить размер заголовков (хедеров) до 2 МВ в конфигах (для запросов может потребоваться до 10 МВ): server.max-http-header-size= 2MB.
В приведенном примере подключаются API USSX ErrorCorrection, имплементируется метод runScenario(CorrectInfoDto correctInfoDto, @CallbackArg BiConsumer<CorrectStatusDto, Throwable> callback) с аргументом-callback, а асинхронный ответ возвращается из кор. сценария в USSX по JSON+RPC отдельным асинхронным методом callback.accept(correctStatusDto, null). В асинхронном ответе возвращается DTO correctStatusDto с результатом выполнения кор. сценария. Имплементация класса ErrorCorrection обязательно помечается аннотацией @ApiLite и @JsonRpcApi.
package com.sbt.uss.jsonrpc.orc;
import com.sbt.core.transport.jsonrpc.api.JsonRpcApi;
import com.sbt.core.transport.lite.api.annotation.ApiLite;
import com.sbt.uss.common.jsonrpc.orc.api.ErrorCorrection;
import com.sbt.uss.common.jsonrpc.orc.dto.CorrectInfoDto;
import com.sbt.uss.errorprocessor.jsonrpc.dto.CorrectStatusDto;
import java.util.function.BiConsumer;
@ApiLite
@JsonRpcApi
public class ErrorCorrectionImpl implements ErrorCorrection {
@Override
public void runScenario(CorrectInfoDto correctInfoDto, BiConsumer<CorrectStatusDto, Throwable> callback) {
System.out.println(correctInfoDto);
try {
Thread.sleep(20_000);
} catch (InterruptedException ex) {
//No-op
}
System.out.println("Sending result back to error-processor with status 0...");
CorrectStatusDto correctStatusDto = new CorrectStatusDto();
correctStatusDto.setErrorID(correctInfoDto.getErrorID());
correctStatusDto.setRequestID(correctInfoDto.getRequestID());
correctStatusDto.setStatus(0);
correctStatusDto.setMessage("Сценарий успешно отработал!");
callback.accept(correctStatusDto, null);
}
}
Реализация корректирующего сценария без использования библиотеки mmt-lite#
Если не используется библитека mmt-lite, то реализация вызовов происходит только через json-rpc (json-сериализация) без дополнительных настроек Istio. При реализации корректирующего сценария необходимо обработку запроса runCorrectionScenario выполнять в новом потоке, чтобы не блокировать синхронный ответ с технической квитанцией на запрос runCorrectionScenario. В приведенном примере подключаются API USSX CorrectionScenario, имплементируется метод runCorrectionScenario(CorrectInfoDto correctInfoDto), обработка выполняется в отдельном потоке, а асинхронный ответ с результатами работы корсценария возвращается методом notifyCorrScenarioResult(CorrectStatusDto correctStatusDto) API ErrorProcessing.
Используется API CorrectionScenario версии 4.7.5 или выше.
Настройки для Maven:
<dependency>
<groupId>sbp.com.sbt.uss</groupId>
<artifactId>uss-orc-api</artifactId>
<version>{версия 4.7.5 и выше}</version>
</dependency>
Используется API ErrorProcessing версии 4.7.5 или выше.
Зависимость для MAVEN:
<dependency>
<groupId><значение></groupId>
<artifactId><значение></artifactId>
<version>{версия 4.7.5 и выше}</version>
</dependency>
Имплементация класса ErrorCorrection обязательно помечается аннотацией @Api и @JsonRpcApi.
package com.sbt.uss.jsonrpc.orc;
import com.sbt.core.transport.jsonrpc.api.JsonRpcApi;
import com.sbt.core.transport.lite.api.annotation.Api;
import com.sbt.uss.common.jsonrpc.orc.api.CorrectionScenario;
import com.sbt.uss.common.jsonrpc.orc.dto.CorrectInfoDto;
import com.sbt.uss.errorprocessor.jsonrpc.api.ErrorProcessing;
import com.sbt.uss.errorprocessor.jsonrpc.dto.CorrectStatusDto;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
@Api
@JsonRpcApi
public class CorrectionScenarioImpl implements CorrectionScenario {
private final Executor executor = Executors.newFixedThreadPool(3);
private final ErrorProcessing errorProcessing;
public CorrectionScenarioImpl(ErrorProcessing errorProcessing) {
this.errorProcessing = errorProcessing;
}
@Override
public void runCorrectionScenario(CorrectInfoDto correctInfoDto) {
System.out.println(correctInfoDto);
executor.execute(() -> {
try {
Thread.sleep(20_000);
} catch (InterruptedException ex) {
//No-op
}
System.out.println("Sending result back to error-processor with status 0...");
CorrectStatusDto correctStatusMmt = new CorrectStatusDto();
correctStatusMmt.setErrorID(correctInfoDto.getErrorID());
correctStatusMmt.setRequestID(correctInfoDto.getRequestID());
correctStatusMmt.setStatus(0);
correctStatusMmt.setMessage("Сценарий успешно отработал!");
errorProcessing.notifyCorrScenarioResult(correctStatusMmt);
});
}
}
Быстрый старт#
Шаг 1. Установка ПО#
Для установки и настройки USSX потребуется развернуть необходимое ПО из раздела «Системные требования» документа Руководство по установке.
Шаг 2. Подключение и конфигурирование#
Информация о способах подключения и конфигурирования USSX для промышленной среды приведена в документе Руководство по установке.
Шаг 3. Настройка рабочего места разработчика#
Создайте структуру каталогов, приведенную в разделе Настройка рабочего места разработчика настоящего документа.
Шаг 4. Настройка переменных среды#
Так как прикладной разработчик не имеет прав администратора, настраивать можно только переменные среды текущего пользователя. Описание настройки переменных среды см. в разделе Настройка переменных среды настоящего документа.
Шаг 5. Установка#
Процесс установки описан в разделе «Установка» документа Руководство по установке.
Шаг 6. Реализация корректирующего сценария#
Реализация вызова USSX из приложения описана в разделе Вызов USSX для регистрации отклонения настоящего документа.
Использование программного компонента#
USSX — готовый инструмент для устранения инцидентов бизнес-процессов и доведения до 100% транзакций до завершения. USSX подходит для следующих потребителей:
юридических лиц;
банковских продуктов;
руководителей процессов и сопровождения.
Возможности USSX следующие:
прием инцидентов, возникших при выполнении бизнес-процессов;
автоматическая и ручная обработка инцидентов;
уведомление пользователей о событиях обработки;
сокращение количества инцидентов по клиентским транзакциям.
Часто встречающиеся проблемы и пути их устранения#
При старте серверов приложений необходимо анализировать логи на предмет отсутствия ошибок.