ServerConfigurationGuide
Сервер. Руководство по настройке
Версия 4.6.0
© 2015-2023, ООО "Процессные технологии"
# Концепция настроек
Настройки системы разделяются на 2 вида: в виде ключ=значение (properties) и в виде списков (xml). Для настроечного файла resource можно определить файл расширения настроек в том же формате с названием wfe.custom.resource. Допускается использование не более 1-го расширяющего файла wfe.custom.resource для файла базовых настроек resource.
Расширяющие файлы wfe.custom.* могут находиться:
- в classpath приложения
- в составе любого jar, находящегося в директории расширений wfe.custom .
В classpath приложения в случае использования Jboss4 входят:
- директория conf
- внутри любого jar, находящегося в deploy
- внутри runawfe.ear, в корне
- внутри runawfe.ear в составе любого jar
- директория для расширений wfe.custom (полный путь ${JBOSS4_HOME}/server/default/wfe.custom).
В classpath приложения в случае использования Jboss7 входят:
- внутри runawfe.ear в составе любого jar
- директория для расширений wfe.custom (полный путь ${JBOSS7_HOME}/standalone/wfe.custom).
# Правило переопределения настроек, определенных в properties-файлах
Используются базовые настройки из файла file.properties, включенные в дистрибутив системы (как правило размещенные в одном из jar внутри runawfe.ear), перезаписываемые из более приоритетного файла wfe.custom.file.properties по совпадающим ключам.
Пример файла wfe.custom.database.properties, определяющего тип соединения с MSSQL Server:
hibernate.connection.datasource=java:/mssqlds hibernate.dialect=ru.runa.wfe.commons.hibernate.SqlServerUnicodeDialect
# Примеры переопределения настроек, определенных в properties-файлах
Пример включения возможности изменения значений переменных экземпляра БП
За эту возможность отвечает настройка executionServiceAPI.updateVariables.enabled, которая по умолчанию имеет значение false4.1.2+, т.е. выключена. Включить данную возможность можно как через веб-интерфейс (Меню "Настройки", раздел "Основные настройки", параметр "executionServiceAPI.updateVariables.enabled"), так и с помощью правила переопределения настроек, определенных в properties-файлах. Рассмотрим подробно второй вариант.
Данный параметр определен в основных настройках system.properties, поэтому требуется переопределить его в файле system.properties. Согласно правилу переопределения, необходимо создать файл wfe.custom.system.properties в каталоге ..\standalone\wfe.custom (если директория wfe.custom не существует, то надо её создать). Например, для Windows версии RunaWFE файл wfe.custom.system.properties должен быть помещен в C:\Program Files\RunaWFE\Simulation\standalone\wfe.custom\.
В файл необходимо добавить следующую строку:
executionServiceAPI.updateVariables.enabled = true
Замечание: Переопределенные настройки применяются только после перезапуска сервера.
Если все было выполнено верно, то в свойствах экземпляра процесса в секции "Переменные процесса" должна появиться ссылка "Изменить значение", как показано на следующем рисунке:
По ссылке будет открыт интерфейс для изменения значения переменных экземпляра БП:
Пример включения административного назначения роли
Данная возможность позволяет разрешить изменение исполнителя в экземпляре процесса. Параметр, отвечающий за это - process.swimlane.assignment.enabled, расположен в web.properties и имеет по умолчанию значение false 4.3.0+.
Согласно правилу переопределения, необходимо создать файл wfe.custom.web.properties в каталоге ..\standalone\wfe.custom (если директория wfe.custom не существует, то надо её создать). Например, для Windows-версии RunaWFE файл wfe.custom.web.properties должен быть помещен в C:\Program Files\RunaWFE\Simulation\standalone\wfe.custom\.
Добавьте в файл строку:
process.swimlane.assignment.enabled = true
Замечание: Переопределенные настройки применяются только после перезапуска сервера.
Если все было выполнено верно, то в свойствах экземпляра процесса в секции "Роли процесса" появится ссылка "Изменить исполнителя":
По ссылке будет открыт интерфейс для изменения исполнителя:
# Правило расширения настроек, определенных в xml-файлах
Для большинства таких настроек действует правило: используются базовые настройки из файла file.xml, включенные в дистрибутив системы (как правило размещенные в одном из jar внутри runawfe.ear) + настройки из файла wfe.custom.file.xml в таком же формате.
Пример файла, определяющего новый валидатор wfe.custom.validators.xml:
<?xml version="1.0" encoding="UTF-8"?> <validators> <validator name="IntersectedVacationsDataValidator" class="ru.runa.wf.validators.IntersectedVacationsDataValidator"/> </validators>
# Расширение контекста Spring
Cоздайте файл wfe.custom.system.context.xml. Это позволит переопределить существующие бины по идентификатору или определить новые.
Пример файла для переопределения логики инициализации класса-реализации бизнес-календаря:
<?xml version="1.0" encoding="UTF-8"?> <beans ...> <bean id="executorLogic" class="ru.runa.wfe.user.logic.ExecutorLogic"> <property name="passwordCheckPattern" value="${strong.passwords.regexp}" /> <property name="setStatusHandlers"> <list> <bean class="ru.runa.wfe.synchronizer.online.ActorStatusSynchronizer" /> </list> </property> </bean> <bean id="initializerLogic" class="ru.runa.common.AlfwfInitializerLogic" /> <bean id="businessCalendar" class="ru.runa.calendar.BusinessCalendarRunaImpl" /> </beans>
Пример файла для переопределения логики инициализации и расширения DAO-уровня:
<?xml version="1.0" encoding="UTF-8"?> <beans ...> <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> <property name="hibernateProperties" ref="hibernateProperties" /> <property name="entityInterceptor"> <bean class="ru.runa.wfe.commons.hibernate.CacheInterceptor" /> </property> <property name="packagesToScan"> <list> <value>ru.runa.wfe</value> <value>ru.runa.rkdemo.dao</value> </list> </property> </bean> <bean id="organizationDAO" class="ru.runa.rkdemo.dao.OrganizationDAO"> <property name="hibernateTemplate" ref="hibernateTemplate" /> </bean> <bean id="visitorDAO" class="ru.runa.rkdemo.dao.VisitorDAO"> <property name="hibernateTemplate" ref="hibernateTemplate" /> </bean> <bean id="roomDAO" class="ru.runa.rkdemo.dao.RoomDAO"> <property name="hibernateTemplate" ref="hibernateTemplate" /> </bean> <bean id="initializerLogic" class="ru.runa.rkdemo.logic.RkDemoInitializerLogic" /> </beans>
# Перечень настроек
# Режим разработки
При установке в исполняемом файле (bat, sh) системной переменной devmode будет включен режим разработки, см. SystemProperties.isDevMode().
# Режим обратной совместимости
При установке в исполняемом файле (bat, sh) системной переменной v3compatibility будет включен режим совместимости по исполнению процессов с 3-й версией, см. SystemProperties.isV3CompatibilityMode().
# Основные настройки (system.properties)
version | Версия системы | Версия системы из pom.xml, проставляется при сборке |
default.administrator.name | Логин администратора, создаваемый при первом запуске системы | |
default.administrator.password | Пароль администратора, устанавливаемый при первом запуске системы | |
default.administrators.group.name | Название группы администраторов, создаваемая при первом запуске системы | |
default.bots.group.name | Название группы ботов, создаваемая при первом запуске системы | |
strong.passwords.regexp | Для усиления защиты системы можно наложить ограничения на пароли пользователей системы. Если определен этот параметр, то все заводимые пароли пользователей должны соответствовать регулярному выражению. Если пароль не отвечает требованиям безопасности, то смена пароля произведена не будет. | |
escalation.enabled | Эскалация заданий включена? | |
escalation.default.hierarchy.loader
(до версии 4.1.1 escalation.default. orgFunction) |
Орг. функция или отношение, для определения иерархии эскалации заданий | ru.runa.wfe.extension.orgfunction. TestOrgFunction (фиктивная орг. функция)
Значением может быть либо полное название класса орг. функции, либо отношение в формате @relationName. Обратное отношение задаётся в формате @!relationName. |
task.default.deadline | Время исполнения задания по умолчанию (если не установлено явно в Среде разработки) | |
task.almostDeadlinePercents | Процент истечения времени исполнения, после которого цвет задания в списке меняется на более приоритетный | |
task.delegation.enabled | Включить делегирование задач | |
authentication.domain.name | Имя домена | |
date.format.pattern | Формат даты в системе (также используется при форматировании даты со временем) | |
|
Разрешить выполнение метода ru.runa.wfe.service.impl.ExecutionServiceBean. updateVariables (User, Long, Map<String, Object>) | |
scriptingServiceAPI.executeGroovyScript. enabled | Разрешить выполнение метода ru.runa.wfe.service.ScriptingService. executeGroovyScript (User, String) | |
token.maximum.depth | Максимально разрешенная вложенность токенов для предотвращения логических циклических ошибок в параллельном шлюзе | |
token.maximum.length 4.4.1+ | Максимально разрешенная длина (количество переходов) токенов для предотвращения логических циклических ошибок | |
file.variable.local.storage. enabled | Разрешить использование локального хранилища в файловой системе для больших файлов | |
file.variable.local. storage.path | Путь к директории-хранилищу | Директория wfe.filedata внутри сервера |
file.variable.local.storage. enableforfilesgreaterthan | Если размер файловой переменной превышает установленный - то файл сохраняется в файловой системе, а не в БД | |
string.variable.length | Значение длины строковой переменной, изменять не рекомендуется! | |
ear.filename | Изменять в случае сборки собственного EAR | |
undefined.variables.allowed | Разрешить создание в процессе переменных, не определенных в Среде разработки? | |
strong.variables.format. enabled | Режим строгой типизации. Требовать соответствие типа определенному в Среде разработки при установке значений переменных | |
variables.autocast.enabled | Выполнять приведение типа к определенному в Среде разработки в случае несоответствия типа значения переменной в режиме строгой типизации | |
timertask.period.millis.job.execution 4.0.6+ | Период обнаружения просроченных таймеров всех процессов, в миллисекундах | |
timertask.start.millis.job. execution 4.0.6+ | Задержка перед первым выполнением просроченных таймеров всех процессов после запуска системы, в миллисекундах | |
job.executor.batch. size 4.4.3+ | Количество обрабатываемых просроченных таймеров в одной транзакции | |
timertask.period.millis.unassigned. tasks.execution 4.0.6+ | Период между обнаружением не назначенных заданий (и попыткой их назначения), в миллисекундах | |
timertask.start.millis.unassigned. tasks.execution 4.0.6+ | Задержка перед первым обнаружением не назначенных заданий (и попыткой их назначения) после запуска системы, в миллисекундах | |
timertask.period.millis.remove.temp.groups 4.3.0+ | Период между очистками временных групп, в миллисекундах | |
timertask.start.millis.remove. temp.groups 4.3.0+ | Задержка перед первым выполнением очистки временных групп после запуска системы, в миллисекундах | |
|
Только в 4.1.0, см. описание | |
trusted.authentication. enabled 4.2.0+ | Разрешена ли доверенная аутентификация с помощью сервисного аккаунта (AuthenticationService.authenticateByTrsustedPrincipal (User, String)) | |
upgrade.process.to.definition. version.enabled 4.3.0+ | Разрешено ли обновление версии исполняющегося процесса на другое по версии (полезно для исправления блокирующих ошибок, может иметь непредсказуемые ошибки в случае, если определение процесса сильно отличается от текущего) | |
process.admin.groups 4.2.2+ | Административное выполнение заданий. Задаётся список названий административных групп, пользователи из которых будут видеть в своём списке заданий чужие задачи. При этом, если описание группы не задано, то входящий в неё пользовать видит все задания в системе. Если в описании задать номера БП через запятую - то увидит задания только из этих БП. Он может их выполнить, в логе выполнения БП будет соответствующая запись. В списке выделяются цветом аналогично заданиям, полученным по замещению. Фильтр на такие задания сейчас не распространяется. | |
process.end.handlers 4.2.2+ | Список классов обработчиков, реализующих ProcessEndHandler, которые будут вызваны по завершению БП | |
process.execution.listeners 4.3.0+ | Список классов обработчиков, реализующих IProcessExecutionListener, которые будут вызваны во время выполнения БП | |
base.process.id.variable. name 4.2.2+ | Название переменной БП, которая хранит ID базового БП, из которого будут грузиться переменные, если они не заданы в текущем БП. Это позволяет не дублировать значения переменных в некоторых случаях при использовании подпроцессов. Переменные должны быть определены в обоих определениях БП. | |
base.process.id.variable. read.all 4.3.0+ | Доступ на чтение в режиме "ID базового БП" ко всем переменным. | |
|
Только в 4.3.0, не вошло в релиз. Определяло соответсвие переменных для режима "ID базового БП" | |
temporary.groups.set. permissions 4.3.0+ | Выдавать ли полномочия на чтение создаваемой временной группе всем её участникам. | |
temporary.groups.delete. on.process.end 4.3.0+ | Удалять временные группы по завершению БП. Если не удалять - то это будет сделано (по умолчанию включено) с помощью периодической задачи чистки неиспользуемых временных групп. | |
temporary.groups.delete. on.task.end 4.3.0+ | Удалять временную группу, на которую назначено задание, при его завершении. Если не удалять - то это будет сделано (по умолчанию включено) с помощью периодической задачи чистки неиспользуемых временных групп. | |
freemarker.static.class.names 4.3.0+ | Список классов, которые доступны по механизму BeansWrapper.getStaticModels() в шаблонах freemarker | |
process.suspension.enabled 4.3.0+ | Разрешить ручную приостановку БП администратором системы. | |
process.execution.node. async.default 4.3.0+ | По умолчанию использовать новую транзакцию для выполнения узлов, подробнее | |
process.execution.node. async.NodeType 4.3.0+ | Использовать новую транзакцию для выполнения узлов определённого типа по умолчанию, подробнее | |
process.swimlane.auto. initialization.enabled 4.3.0+ | Разрешить авто-инициализацию роли при доступе к ней как к переменной. | |
check.process.start.permissions 4.3.0+ | Проверять права на запуск БП. Используется только в случае интеграции со сторонней подсистемой полномочий. | |
definition.comments.empty. allowed 4.3.0+ | Разрешить загрузку определения процесса, в котором нет новых комментариев. | |
definition.comments. collisions.allowed 4.3.0+ | Разрешить загрузку определения процесса, в котором отсутствуют некоторые комментарии из прежней версии определения. | |
process.execution.message. predefined.selector.enabled 4.3.0+ | Использовать ли для обработки узлов-сигналов предвычисленное значение селектора? Использование улучшает производительность обработки сигналов, но накладывает ограничение: значение селектора вычисляется на момент прихода точки управления в узел-приёмник и не изменяется при изменении значения участвующих в нём переменных. | |
process.execution.message. predefined.selector.only. strict.compliance.handling 4.3.0+ | В случае использования предвычисленного значения селектора таблицы маршрутизации: использовать только прямое соответствие? В случае прямого соответствия таблицы маршрутизации узлов отправителя и получателя должны полностью совпадать (что накладывает функциональные ограничения на работу сигналов), но получается выигрыш по производительности. | |
variables.invalid.default. values.allowed 4.4.0+ | Допускать загрузку в систему БП, имеющих некорректные значения переменных по умолчанию. | |
variables.invalid.default. values.allowed.before 4.4.0+ | Дата, начиная с которой действует настройка variables.invalid.default.values.allowed. Использовать стоит только для обратной совместимости ранее загруженных БП. |
# Управление полями представлений (class.presentation.properties)
Поля представлений, используемых при отображении списка объектов, настраиваются и могут находится в 3 состояниях: ENABLED, DISABLED и HIDDEN. По умолчанию все поля находятся в состоянии ENABLED.
В состоянии ENABLED поле представления отображается в таблице при раскрытии представления. Фильтрация, сортировка и группировка по полю доступны для изменения пользователем и имеют ожидаемый эффект.
В состоянии HIDDEN поле представления не отображается в таблице при раскрытии представления. Фильтрация, сортировка и группировка по этому полю не доступны для изменения пользователем, но имеют эффект в системе. Таким образом, если в поле на момент перевода в состояние HIDDEN установлена фильтрация, то фильтрация по этому полю продолжит применяться при отображении списка объектов. Поля в состоянии HIDDEN наиболее разумно использовать в соединении с автоматическим проставлением свойств поля для установления одинакового вида представления у всех пользователей. Если поле необходимо только убрать из отображения, что бы оно не влияло на систему, то используйте состояние DISABLED.
В состоянии DISABLED поле представления не отображается в таблице при раскрытии представления. Фильтрация, сортировка и группировка по этому полю не доступны для изменения пользователем и не имеют никакого эффекта в системе. Таким образом, если в поле на момент перевода в состояние DISABLED установлена фильтрация, то фильтрация по этому полю не будет применяться при отображении списка объектов.
В конфигурационном файле уже прописаны по умолчанию все поля, которые могут быть настроены в системе, и установлены в состояние ENABLED.
# Настройка веб-интерфейса (web.properties)
group.subprocess.enabled | Доступна ли группировка по подпроцессам в фильтре? | |
task.form.autoShowNext | Автоматически показывать форму следующего задания (в том же токене) | |
task.form.highlightRequiredFields | Обозначать обязательные поля на форме задания | |
task.form.ajaxFileInputEnabled | Использовать в качестве элемента загрузки файла нестандартный элемент ввода (это обеспечивает сохранение загруженного файла при неуспешной проверке данных и возможность очистки файла; используется jquery file upload). Поддержка браузерами: IE8+, Firefox, Chrome | |
task.form.external.js.libs 4.2.0+ | Использовать внешние библиотеки javascript в формах заданий (значения разделяются точкой с запятой) | |
view.logs.limit.lines.count | Максимальное количество отображаемых строк лога | |
view.logs.timeout.autoreload.seconds | Таймаут перезагрузки лога на странице просмотра логов | |
process.graph.autoRefreshInterval.seconds | Таймаут для авто-перезагрузки графа процесса | |
process.showGraphMode | Реализовано два режима просмотра:
1) false: Граф и свойства бизнес-процесса расположены на одной странице 2) true: Граф и свойства бизнес-процесса разнесены на две разные страницы и переход между ними осуществляется по ссылке в правом верхнем углу страницы |
|
process.variables.displayJavaType | Отображать ли java-тип переменной в списке переменных процесса? | |
ntlm.enabled | Разрешить ли аутентификацию по NTLM в вебе? | |
ntlm.domain | Название домена | |
confirmation.* | Требовать ли подтверждения пользовательских действий? | |
menu.additional_links | Класс-провайдер дополнительных ссылок, см. ru.runa.common.WebResources.getAdditionalLinks() | |
process.definition.ajax.bulk.deployment.enabled 4.2.0+ | Возможность множественной загрузки определений процессов | |
process.removal.enabled 4.2.0+ | Возможность удаления остановленного процесса администратором | |
|
Включить ли делегирование задач? | переехала в system.properties 4.4.1+ |
process.swimlane.assignment.enabled 4.3.0+ | Включить ли административное назначение роли? | |
process.variable.assignment.enabled 4.4.0+ | Включить ли административное редактирование переменных? | |
process.task.filters.enabled 4.3.0+ | Включить ли использование фильтров по атрибутам задач в списке запущенных процессов? | |
import.export.enabled 4.3.0+ | Включить ли импорт/экспорт данных через файл? |
# Настройка работы с приложениями Office (office.properties)
docx.placeholder.start | Начало управляющей последовательности символов | ${4.1.0+ |
docx.placeholder.end | Окончание управляющей последовательности символов | }4.1.0+ |
docx.element.start | Символ указания начала элемента контейнера4.3.0- | |
docx.element.end | Символ указания окончания элемента контейнера4.3.0- | |
docx.placeholder.vmerge | Символ для объединения ячейки таблицы по вертикали4.4.0+ |
# Настройка графа процесса (graph.properties)
edgingOnly | Рисовать только рамки поверх скриншота из Среды разработки (иначе - полная генерация картинки) | |
backgroundColor | Цвет фона | |
figureBackgroundColor | Цвет фона элемента | |
activeFigureBackgroundColor | Цвет фона активного элемента | |
baseColor | Цвет рисования элементов | |
textColor | Цвет текста | |
transitionColor | Цвет рисования переходов | |
highlightColor | Цвет рисования задействованных элементов и переходов | |
alarmColor | Цвет просроченных заданий | |
lightAlarmColor | Цвет заданий, почти просроченных | |
fontSize | Размер шрифта (только в режиме полной отрисовки) | |
fontFamily | Шрифт (только в режиме полной отрисовки) | |
bpmn.showSwimlane | Рисовать название ролей на графе (только в режиме полной отрисовки) | |
logs.enabled | Показывать историю выполнения процесса на графе |
# Настройки бизнес-календаря (business.calendar.properties)
См. статью о бизнес-календаре.
# Настройки кеширования (cache.properties)
В системе существуют кешы на уровне логики некоторых сущностей: список заданий, правила замещения, исполнители, определения процессов. Они хранят информацию в сложных структурах, например: список заданий по пользователям (с учетом замещений), пользователи групп, последние версии определений процессов и т.п..
По умолчанию включен режим работы smart. Он заключается в том, что при изменении объекта пересчитывается только затрагиваемая часть кеша.
Кеширование не может быть отключено полностью.
smart_cache | Включен режим работы smart |
# Настройки бот-станции (botstation.properties)
botstation.invocation.period.seconds | При включенной периодической активации бот-станции таймаут между работой ботов, в секундах | |
botstation.system.username | Логин пользователя с правами на работу с бот-станцией | |
botstation.system.password | Пароль пользователя с правами на работу с бот-станцией | |
thread.pool.size | Количество потоков, в которых работает бот-станция | |
taskhandler.jar.names | Поиск обработчиков ботов для списка в веб-интерфейсе осуществляется по этим библиотекам | |
bot.logger.class | Дополнительное логирование: класс, реализующий ru.runa.wf.logic.bot.BotLogger | |
botstations.autostart.enabled 4.2.0+ | Автоматический запуск периодического выполнения всех бот-станций при запуске системы | |
botstation.failedExecutionInitialDelaySeconds 4.2.0+ | Начальное значение задержки после неудачного выполнения задачи бота (следующее значение удвоится) (в секундах) | |
botstation.failedExecutionMaxDelaySeconds 4.2.0+ | Максимальное значение задержки после неудачного выполнения задачи бота (в секундах) | |
botstation.stuck.timeout.minutes 4.3.0+ | Таймаут, используемый для обнаружения зависших заданий ботов и аварийного их завершения (в минутах) |
# Настройки соединения по Java API с EJB (ejb.properties)
Если вы используете слой делегатов в wfe-service.jar, то необходимо настроить соединение с EJB.
ejb.type | Тип соединения. local для использования локального интерфейса в той же JVM, иначе - remote | |
ejb.jndiName.format | Формат имени JNDI для получения EJB | Подставляется с помощью maven из указанного профиля |
В случае использования удаленного интерфейса (ejb remote) нужно использовать файл jndi.properties.
java.naming.factory.initial | Фабрика JNDI | org.jnp.interfaces.NamingContextFactory | org.jboss.naming.remote.client. InitialContextFactory |
java.naming.provider.url | Строка соединения | jnp://localhost:10099 | remote://localhost:4447 |
java.naming.factory.url.pkgs | Используется только в случае jboss4 | org.jboss.naming:org.jnp.interfaces | |
jboss.naming.client.ejb.context | Используется только в случае jboss7 |
# Настройки орг. функций для работы с БД (sql.orgfunction.properties)
Орг. функции с названием класса SQL*Function (SQLChiefFunction, SQLChiefRecursiveFunction, SQLDirectorFunction, SQLSubordinateFunction, SQLSubordinateRecursiveFunction) настраиваются в файле sql.orgfunction.properties.
datasource | Название источника данных БД | java:/OrgFunctionDS |
chief.code.by.subordinate.code.sql | Запрос на получение руководителя сотрудника | select CHIEF_ID from EMPLOYEES where ID = ? |
subordinate.codes.by.chief.code.sql | Запрос на получение подчиненных сотрудников руководителя | select ID from EMPLOYEES where CHIEF_ID = ? |
get.all.directors.codes.sql | Запрос на получение директора | SELECT ID FROM DIRECTORS |
# Настройка аутентификации
В контексте Spring (system.context.xml) есть бин, ответственный за список логин-модулей, используемых для аутентификации:
<bean id="loginModuleConfiguration" class="ru.runa.wfe.security.auth.LoginModuleConfiguration"> <property name="loginModuleClassNames"> <list> <value>ru.runa.wfe.security.auth.InternalDBPasswordLoginModule</value> <value>ru.runa.wfe.security.auth.KerberosLoginModule</value> <value>ru.runa.wfe.security.auth.TrustedLoginModule</value> </list> </property> </bean>
Нужно включить требуемые и отключить неиспользуемые.
# Настройка Kerberos аутентификации
Руководство по настройке аутентификации Kerberos.
# Настройка LDAP аутентификации
Руководство по настройке аутентификации LDAP.
# Настройка соединения с БД
Система использует Hibernate ORM и может работать на любой СУБД. Тестирование системы производится на: PostgreSQL, MS SQL Server, Oracle, HSQL.
Настройка осуществляется путем:
- регистрации класса-драйвера в сервере приложений
- регистрации источника данных в сервере приложений
- привязки источника данных и установке соответствующего диалекта в database.properties
- отдельно настраивается СУБД для хранения сообщений (её не нужно настраивать если в процессах не используются узлы-сообщения или на них не возложена критичная логика). TODO: примеры настройки
Файл database.properties помимо этого содержит дополнительные настройки, информацию по которым можно получить в оригинале.
# Инициализация базы данных
При первом запуске системы структура базы данных будет создана автоматически. Перед этим необходимо создать пустую БД (или использовать существующую с неконфликтными названиями объектов БД) и предоставить пользователю, который указан в источнике данных, прав на создание объектов БД (таблиц и последовательностей). После инициализации БД изменение структуры БД в дальнейшем не происходит, за исключением патчей БД при обновлении версии. Поэтому рекомендуется отнимать права создания и изменения объектов БД в штатном режиме работы.
# При использовании Wildfly10 (и старше)
# Oracle
Создайте модуль com.oraclejdbc.
Структура модуля:
modules \ - system \ - layers \ - base \ - com \ - oraclejdbc \ - main \ - module.xml - ojdbc6_g.jar
module.xml:
<?xml version="1.0" encoding="UTF-8"?> <module xmlns="urn:jboss:module:1.3" name="com.oraclejdbc"> <resources> <resource-root path="ojdbc6_g.jar"/> </resources> <dependencies> <module name="javax.api"/> <module name="javax.transaction.api"/> </dependencies> </module>
Добавьте секцию источника данных и драйвера в standalone.xml:
<datasource jndi-name="java:jboss/datasources/OracleDS" pool-name="OracleDS"> <connection-url>jdbc:oracle:thin:@localhost:1521:XE</connection-url> <driver>oracle</driver> <transaction-isolation>TRANSACTION_READ_COMMITTED</transaction-isolation> <pool> <min-pool-size>10</min-pool-size> <max-pool-size>100</max-pool-size> <prefill>true</prefill> </pool> <security> <user-name>wfe</user-name> <password>wfe</password> </security> <validation> <valid-connection-checker class-name="org.jboss.jca.adapters.jdbc.extensions.oracle.OracleValidConnectionChecker"/> <validate-on-match>true</validate-on-match> <background-validation>false</background-validation> <stale-connection-checker class-name="org.jboss.jca.adapters.jdbc.extensions.oracle.OracleStaleConnectionChecker"/> <exception-sorter class-name="org.jboss.jca.adapters.jdbc.extensions.oracle.OracleExceptionSorter"/> </validation> <timeout> <blocking-timeout-millis>5000</blocking-timeout-millis> <idle-timeout-minutes>5</idle-timeout-minutes> </timeout> <statement> <prepared-statement-cache-size>32</prepared-statement-cache-size> <share-prepared-statements>true</share-prepared-statements> </statement> </datasource> <drivers> <driver name="oracle" module="com.oraclejdbc"> <xa-datasource-class>oracle.jdbc.driver.OracleDriver</xa-datasource-class> </driver> </drivers>
В database.properties установите hibernate.connection.datasource=jboss/datasources/OracleDS и диалект hibernate.dialect=org.hibernate.dialect.OracleDialect (или org.hibernate.dialect.Oracle10gDialect).
Для работы с версией XE в standalone.conf.bat установите переменные окружения.
set JAVA_OPTS=%JAVA_OPTS% -Duser.language=en -Duser.country=us
# PostgreSQL
Создайте модуль org.postgresql.
Структура модуля:
modules \ - system \ - layers \ - base \ - org \ - postgresql \ - main \ - module.xml - postgresql-42.2.4.jar
module.xml:
<?xml version="1.0" encoding="UTF-8"?> <module xmlns="urn:jboss:module:1.3" name="org.postgresql"> <resources> <resource-root path="postgresql-42.2.4.jar"/> </resources> <dependencies> <module name="javax.api"/> <module name="javax.transaction.api"/> </dependencies> </module>
Добавьте секцию источника данных и драйвера в standalone.xml:
<datasource jndi-name="java:jboss/datasources/PostgreDS" pool-name="PostgreDS"> <connection-url>jdbc:postgresql://localhost:5432/runawfe</connection-url> <driver>postgresql</driver> <transaction-isolation>TRANSACTION_READ_COMMITTED</transaction-isolation> <pool> <min-pool-size>10</min-pool-size> <max-pool-size>100</max-pool-size> <prefill>true</prefill> </pool> <security> <user-name>runawfe</user-name> <password>1</password> </security> <validation> <valid-connection-checker class-name="org.jboss.jca.adapters.jdbc.extensions.postgres.PostgreSQLValidConnectionChecker"/> <validate-on-match>true</validate-on-match> <background-validation>false</background-validation> <exception-sorter class-name="org.jboss.jca.adapters.jdbc.extensions.postgres.PostgreSQLExceptionSorter"/> </validation> <statement> <prepared-statement-cache-size>32</prepared-statement-cache-size> <share-prepared-statements>true</share-prepared-statements> </statement> </datasource> <drivers> <driver name="postgresql" module="org.postgresql"> <xa-datasource-class>org.postgresql.xa.PGXADataSource</xa-datasource-class> </driver> </drivers>
В database.properties установите:
hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect hibernate.connection.datasource=jboss/datasources/PostgreDS
# MSSQL
Создайте модуль com.microsoft.sqlserver.
Структура модуля:
modules \ - com \ - microsoft \ - sqlserver \ - main \ - module.xml - mssql-jdbc-7.0.0.jre8.jar
module.xml:
<module xmlns="urn:jboss:module:1.3" name="com.microsoft.sqlserver"> <resources> <resource-root path="mssql-jdbc-7.0.0.jre8.jar" /> </resources> <dependencies> <module name="javax.api"/> <module name="javax.transaction.api"/> </dependencies> </module>
Добавьте секцию источника данных и драйвера в standalone.xml:
<datasources> <datasource jndi-name="java:/mssqlds" pool-name="java:/mssqlds_Pool" enabled="true" use-java-context="true"> <connection-url>jdbc:sqlserver://localhost:1433;DatabaseName=runawfe</connection-url> <driver>mssql</driver> <transaction-isolation>TRANSACTION_READ_COMMITTED</transaction-isolation> <pool> <min-pool-size>5</min-pool-size> <max-pool-size>30</max-pool-size> </pool> <security> <user-name>runawfe</user-name> <password>wfe</password> </security> </datasource> <drivers> <driver name="mssql" module="com.microsoft.sqlserver"> <driver-class>com.microsoft.sqlserver.jdbc.SQLServerDriver</driver-class> <xa-datasource-class>com.microsoft.sqlserver.jdbc.SQLServerXADataSource</xa-datasource-class> </driver> </drivers> </datasources>
В database.properties установите ru.runa.wfe.commons.hibernate.SqlServerUnicodeDialect.
В случае возникновения ошибки вида "Тип данных столбца bpm_process.ID не совпадает с типом данных ссылающегося столбца BPM_SUBPROCESS.root_process_id во внешнем ключе fk_subprocess_root" при переходе на следующую версию RunaWFE Free, требуется использовать диалект SqlServerUnicodeAnd2012BigintBackCompatibilityDialect.
Если не используется unicode - dialect.SQLServerDialect (или SqlServerAnd2012BigintBackCompatibilityDialect).
# MySQL (Поддержка ожидается)
Замечание: Ожидается поддержка.
Создайте модуль com.mysql со структурой:
modules \ - com \ - mysql \ - main \ - module.xml - mysql-connector-java-8.0.21.jar
module.xml:
<?xml version="1.0" encoding="UTF-8"?> <module xmlns="urn:jboss:module:1.0" name="com.mysql"> <resources> <resource-root path="mysql-connector-java-8.0.21.jar" /> </resources> <dependencies> <module name="javax.api"/> <module name="javax.transaction.api"/> </dependencies> </module>
Добавьте в standalone.xml:
<datasource jndi-name="java:/mysqlds" pool-name="java:/mysqlds_Pool" enabled="true" use-java-context="true"> <connection-url>jdbc:mysql://localhost:3306/wfe_1?UseUnicode=true&characterEncoding=UTF-8&useOldAliasMetadataBehavior=true&serverTimezone=UTC</connection-url> <driver>mysql</driver> <transaction-isolation>TRANSACTION_READ_COMMITTED</transaction-isolation> <pool> <min-pool-size>10</min-pool-size> <max-pool-size>100</max-pool-size> <prefill>true</prefill> </pool> <security> <user-name>root</user-name> <password>***</password> </security> <validation> <valid-connection-checker class-name="org.jboss.jca.adapters.jdbc.extensions.mysql.MySQLValidConnectionChecker"/> <validate-on-match>true</validate-on-match> <background-validation>false</background-validation> <exception-sorter class-name="org.jboss.jca.adapters.jdbc.extensions.mysql.MySQLExceptionSorter"/> </validation> <statement> <prepared-statement-cache-size>32</prepared-statement-cache-size> <share-prepared-statements>true</share-prepared-statements> </statement> </datasource> <drivers> <driver name="mysql" module="com.mysql"> <xa-datasource-class>com.mysql.jdbc.jdbc2.optional.MysqlXADataSource</xa-datasource-class> </driver> </drivers>
В файле database.properties установите hibernate.dialect=ru.runa.wfe.commons.hibernate.MySQL5UnicodeDialect, hibernate.connection.datasource=java:/mysqlds .
# При использовании Jboss7
По умолчанию в системе используется H2 в режиме пересоздания при перезагрузке сервера. Для перевода в другой режим измените строку соединения в standalone.xml.
Настройка осуществляется путем:
- создания модуля для jdbc драйвера
- регистрации источника данных в standalone.xml (<subsystem xmlns="urn:jboss:domain:datasources:1.0"><datasources>)
- привязки источника данных и установке соответствующего диалекта в database.properties.
# PostgreSQL
Создайте модуль org.postgresql.
Структура модуля:
modules \ - org \ - postgresql \ - main \ - module.xml - postgresql-8.4-701.jdbc4.jar
module.xml:
<?xml version="1.0" encoding="UTF-8"?> <module xmlns="urn:jboss:module:1.0" name="org.postgresql"> <resources> <resource-root path="postgresql-8.4-701.jdbc4.jar"/> </resources> <dependencies> <module name="javax.api"/> <module name="javax.transaction.api"/> </dependencies> </module>
Добавьте секцию источника данных и драйвера в standalone.xml:
<datasource jndi-name="java:jboss/datasources/PostgreDS" pool-name="PostgreDS"> <connection-url>jdbc:postgresql://localhost:5432/wfe</connection-url> <driver>postgresql</driver> <transaction-isolation>TRANSACTION_READ_COMMITTED</transaction-isolation> <pool> <min-pool-size>10</min-pool-size> <max-pool-size>100</max-pool-size> <prefill>true</prefill> </pool> <security> <user-name>wfe</user-name> </security> <validation> <valid-connection-checker class-name="org.jboss.jca.adapters.jdbc.extensions.postgres.PostgreSQLValidConnectionChecker"/> <validate-on-match>true</validate-on-match> <background-validation>false</background-validation> <exception-sorter class-name="org.jboss.jca.adapters.jdbc.extensions.postgres.PostgreSQLExceptionSorter"/> </validation> <statement> <prepared-statement-cache-size>32</prepared-statement-cache-size> <share-prepared-statements>true</share-prepared-statements> </statement> </datasource> <drivers> <driver name="postgresql" module="org.postgresql"> <xa-datasource-class>org.postgresql.xa.PGXADataSource</xa-datasource-class> </driver> </drivers>
В database.properties установите hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect, hibernate.connection.datasource=jboss/datasources/PostgreDS .
# Oracle
Создайте модуль com.oraclejdbc.
Структура модуля:
modules \ - com \ - oraclejdbc \ - main \ - module.xml - ojdbc6_g.jar
module.xml:
<?xml version="1.0" encoding="UTF-8"?> <module xmlns="urn:jboss:module:1.0" name="com.oraclejdbc"> <resources> <resource-root path="ojdbc6_g.jar"/> </resources> <dependencies> <module name="javax.api"/> <module name="javax.transaction.api"/> </dependencies> </module>
Добавьте секцию источника данных и драйвера в standalone.xml:
<datasource jndi-name="java:jboss/datasources/OracleDS" pool-name="OracleDS"> <connection-url>jdbc:oracle:thin:@localhost:1521:XE</connection-url> <driver>oracle</driver> <transaction-isolation>TRANSACTION_READ_COMMITTED</transaction-isolation> <pool> <min-pool-size>10</min-pool-size> <max-pool-size>100</max-pool-size> <prefill>true</prefill> </pool> <security> <user-name>wfe</user-name> <password>wfe</password> </security> <validation> <valid-connection-checker class-name="org.jboss.jca.adapters.jdbc.extensions.oracle.OracleValidConnectionChecker"/> <validate-on-match>true</validate-on-match> <background-validation>false</background-validation> <stale-connection-checker class-name="org.jboss.jca.adapters.jdbc.extensions.oracle.OracleStaleConnectionChecker"/> <exception-sorter class-name="org.jboss.jca.adapters.jdbc.extensions.oracle.OracleExceptionSorter"/> </validation> <timeout> <blocking-timeout-millis>5000</blocking-timeout-millis> <idle-timeout-minutes>5</idle-timeout-minutes> </timeout> <statement> <prepared-statement-cache-size>32</prepared-statement-cache-size> <share-prepared-statements>true</share-prepared-statements> </statement> </datasource> <drivers> <driver name="oracle" module="com.oraclejdbc"> <xa-datasource-class>oracle.jdbc.driver.OracleDriver</xa-datasource-class> </driver> </drivers>
В database.properties установите hibernate.dialect=org.hibernate.dialect.OracleDialect, hibernate.connection.datasource=jboss/datasources/OracleDS .
Для работы с версией XE в standalone.conf.bat установите переменные окружения.
set JAVA_OPTS=%JAVA_OPTS% -Duser.language=en -Duser.country=us
# Tibero
Создайте модуль com.tmax.tibero.
Структура модуля:
modules \ - com \ - tmax \ - tibero \ - main \ - module.xml - tibero5-jdbc.jar
module.xml:
<?xml version="1.0" encoding="UTF-8"?> <module xmlns="urn:jboss:module:1.0" name="com.tmax.tibero"> <resources> <resource-root path="tibero5-jdbc.jar"/> </resources> <dependencies> <module name="javax.api"/> <module name="javax.transaction.api"/> </dependencies> </module>
Добавьте секцию источника данных и драйвера в standalone.xml:
<datasource jndi-name="java:jboss/datasources/TiberoDS" pool-name="TiberoDS"> <connection-url>jdbc:tibero:thin:@localhost:8629:tibero</connection-url> <driver>tibero</driver> <security> <user-name>wfe</user-name> <password>wfe</password> </security> <validation> <valid-connection-checker class-name="org.jboss.jca.adapters.jdbc.extensions.oracle.OracleValidConnectionChecker"/> <validate-on-match>true</validate-on-match> <background-validation>false</background-validation> <stale-connection-checker class-name="org.jboss.jca.adapters.jdbc.extensions.oracle.OracleStaleConnectionChecker"/> <exception-sorter class-name="org.jboss.jca.adapters.jdbc.extensions.oracle.OracleExceptionSorter"/> </validation> <timeout> <blocking-timeout-millis>5000</blocking-timeout-millis> <idle-timeout-minutes>5</idle-timeout-minutes> </timeout> <statement> <prepared-statement-cache-size>32</prepared-statement-cache-size> <share-prepared-statements>true</share-prepared-statements> </statement> </datasource> <drivers> <driver name="tibero" module="com.tmax.tibero"> <xa-datasource-class>com.tmax.tibero.jdbc.TbDriver</xa-datasource-class> </driver> </drivers>
В database.properties установите hibernate.dialect=org.hibernate.dialect.OracleDialect, hibernate.connection.datasource=jboss/datasources/TiberoDS .
# Derby
Создайте модуль org.apache.derby.
Структура модуля:
modules \ - org \ - apache \ - derby \ - main \ - module.xml - derby.jar
module.xml:
<module xmlns="urn:jboss:module:1.0" name="org.apache.derby"> <resources> <resource-root path="derby.jar"/> </resources> <dependencies> <module name="javax.api"/> <module name="javax.transaction.api"/> <module name="javax.servlet.api" optional="true"/> </dependencies> </module>
Добавьте секцию источника данных и драйвера в standalone.xml:
<datasource jndi-name="java:jboss/datasources/DerbyDS" pool-name="DerbyDS"> <connection-url>jdbc:derby:runawfe;restoreFrom=~/backupdirectory/runawfe</connection-url> <driver>derby</driver> <security> <user-name>wfe</user-name> <password>wfe</password> </security> </datasource> <drivers> <driver name="derby" module="org.apache.derby"/> </drivers>
В database.properties установите hibernate.dialect=org.hibernate.dialect.DerbyDialect, hibernate.connection.datasource=jboss/datasources/DerbyDS .
# SQL Server
Создайте модуль net.sourceforge.jtds.
Структура модуля:
modules \ - net \ - sourceforge \ - jtds \ - main \ - module.xml - jtds-1.2.7.jar
module.xml:
<?xml version="1.0" encoding="UTF-8"?> <module xmlns="urn:jboss:module:1.0" name="net.sourceforge.jtds"> <resources> <resource-root path="jtds-1.2.7.jar"/> </resources> <dependencies> <module name="javax.api"/> <module name="javax.transaction.api"/> </dependencies> </module>
Добавьте секцию источника данных и драйвера в standalone.xml:
<datasource jndi-name="java:jboss/datasources/RunawfeDS" pool-name="RunawfeDS"> <connection-url>jdbc:jtds:sqlserver://localhost;DatabaseName=runawfe</connection-url> <driver>mssql</driver> <transaction-isolation>TRANSACTION_READ_COMMITTED</transaction-isolation> <pool> <min-pool-size>5</min-pool-size> <max-pool-size>30</max-pool-size> </pool> <security> <user-name>runawfe</user-name> <password>wfe</password> </security> <validation> <valid-connection-checker class-name="org.jboss.jca.adapters.jdbc.extensions.mssql.MSSQLValidConnectionChecker"/> <validate-on-match>true</validate-on-match> <background-validation>false</background-validation> </validation> </datasource> <driver name="mssql" module="net.sourceforge.jtds"> <driver-class>net.sourceforge.jtds.jdbc.Driver</driver-class> <xa-datasource-class>net.sourceforge.jtds.jdbcx.JtdsDataSource</xa-datasource-class> </driver>
В database.properties установите hibernate.dialect=org.hibernate.dialect.SQLServerDialect (или ru.runa.wfe.commons.hibernate.SqlServerUnicodeDialect), hibernate.connection.datasource=jboss/datasources/RunawfeDS .
# MySQL
Замечание: Вместо MySQL для RunaWFE лучше использовать PostgreSQL. RunaWFE работает с MySQL, но в настоящее время мы не предоставляем патчи обновления системы для этой БД. Если вы все-таки используете RunaWFE с MySQL, то обновление БД можно произвести вручную (но это не легко). Подробнее можно посмотреть здесь.
Создайте модуль com.mysql со структурой:
modules \ - com \ - mysql \ - main \ - module.xml - mysql-connector-java-5.1.7-bin.jar
module.xml:
<?xml version="1.0" encoding="UTF-8"?> <module xmlns="urn:jboss:module:1.0" name="com.mysql"> <resources> <resource-root path="mysql-connector-java-5.1.7-bin.jar" /> </resources> <dependencies> <module name="javax.api"/> <module name="javax.transaction.api"/> </dependencies> </module>
Добавьте в standalone.xml:
<datasource jndi-name="java:jboss/datasources/RunawfeDS" pool-name="RunawfeDS"> <connection-url>jdbc:mysql://localhost:3306/wfe?UseUnicode=true&characterEncoding=UTF-8&useOldAliasMetadataBehavior=true</connection-url> <driver>mysql</driver> <transaction-isolation>TRANSACTION_READ_COMMITTED</transaction-isolation> <pool> <min-pool-size>10</min-pool-size> <max-pool-size>100</max-pool-size> <prefill>true</prefill> </pool> <security> <user-name>root</user-name> </security> <validation> <valid-connection-checker class-name="org.jboss.jca.adapters.jdbc.extensions.mysql.MySQLValidConnectionChecker"/> <validate-on-match>true</validate-on-match> <background-validation>false</background-validation> <exception-sorter class-name="org.jboss.jca.adapters.jdbc.extensions.mysql.MySQLExceptionSorter"/> </validation> <statement> <prepared-statement-cache-size>32</prepared-statement-cache-size> <share-prepared-statements>true</share-prepared-statements> </statement> </datasource> <drivers> <driver name="mysql" module="com.mysql"> <xa-datasource-class>com.mysql.jdbc.jdbc2.optional.MysqlXADataSource</xa-datasource-class> </driver> </drivers>
В файле database.properties установите hibernate.dialect=org.hibernate.dialect.MySQL5Dialect, hibernate.connection.datasource=jboss/datasources/RunawfeDS .
# Настройки производительности
Требования к аппаратным ресурсам сильно зависят от числа одновременно работающих пользователей и числа выполняющихся экземпляров процессов. Но в любом случае необходимо настраивать параметры JVM под существующие аппаратные ресурсы.
# Настройки JVM
Используйте файл run.bat (в Windows) или run.sh в Linux. В нем измените параметры JVM (JAVA_OPTS).
Например, в run.bat отредактируйте строку:
set JAVA_OPTS=%JAVA_OPTS% -Xms128m -Xmx512m
Для большинства случаев можно:
- Выделить максимальное кол-во памяти процессу (-Xmx8GB)
- Установить размер памяти (perm gen) в 256M (-XX:MaxPermSize:256m)
- Убедиться что используется опция "server" VM (-server).
Чтобы не использовался файл подкачки, удостоверьтесь, что размер памяти, указанный с помощью опции "-Xmx", не превышает размер физической памяти ОЗУ. Также стоит зарезервировать некий запас памяти для ОС и других приложений.
Если выделить процессу менее 1Гб ОЗУ, то настройка других параметров особой пользы не принесет. В ином случае остальные параметры могут сильно повлиять на производительность системы.
Пример конфигурации (32-бит, dual-core per CPU, 4GB ОЗУ):
-server -XX:+UseConcMarkSweepGC -XX:+CMSIncrementalMode -XX:+CMSClassUnloadingEnabled -Xms512m -Xmx1024m -XX:+HeapDumpOnOutOfMemoryError -XX:+PrintConcurrentLocks -XX:MaxPermSize=256m
Примеры конфигурации на многопроцессорном сервере (64-бит ОС, JVM; multi-CPU, 8GB):
-server -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+CMSClassUnloadingEnabled -Xms1g -Xmx4g -Xss256k -XX:PermSize=256m -XX:MaxPermSize=256m -XX:+HeapDumpOnOutOfMemoryError -XX:+PrintConcurrentLocks
Опции для включения параллельного сборщика мусора:
-XX:+UseConcMarkSweepGC -XX:+CMSClassUnloadingEnabled -XX:+ParallelRefProcEnabled -XX:NewRatio=5 -XX:+CMSScavengeBeforeRemark
Опции для анализа исполнения сборщика мусора и его настройки:
-XX:+PrintGCTimeStamps -XX:+PrintGCDetails -Xloggc:"../server/default/log/gc.log"
# Получение дампов памяти и стека JVM для анализа производительности
# Используя утилиты JDK
Перейдите в директорию "${JDK}\bin\".
Для получения дампа памяти выполните команду:
jmap -dump:format=b,file=heap.bin pid, где - pid - идентификатор процесса.
Для получения дампа стека JVM выполните команду:
jstack pid, где - pid - идентификатор процесса.
При возникновении проблем (например, "Недостаточно памяти для выполнения команды"), рекомендуем воспользоваться любым из нижеописанных способов.
# Используя JavaMelody
В 4-й версии она настроена в дистрибутиве и доступна по ссылке http://localhost:8080/wfe/monitoring. Падение производительности может составлять до 30%.
Адрес проекта: http://code.google.com/p/javamelody/
С помощью данного инструмента можно не только получать дампы, но и анализировать поведение системы. Дополнительная нагрузка в штатном режиме незначительна, что позволяет использовать данный инструмент в режиме эксплуатации.
Дамп стека потоков можно получить: Threads -> Details -> Dump threads as text .
Дамп памяти JVM можно получить: Generate a heap dump .
Отключить javamelody можно:
- закомментировав строку hibernate.jdbc.factory_class=net.bull.javamelody.HibernateBatcherFactory в database.properties
- в web.xml закомментировать или удалить фрагмент:
<filter> <filter-name>monitoring</filter-name> <filter-class>net.bull.javamelody.MonitoringFilter</filter-class> </filter> <filter-mapping> <filter-name>monitoring</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <listener> <listener-class>net.bull.javamelody.SessionListener</listener-class> </listener>
# Используя VisualVM
Адрес проекта: visualvm.java.net .
Если вы запускаете VisualVM на том же компьютере, где запущен WFE, и VisualVM обнаружил процесс WFE, то дополнительных настроек производить не нужно.
Если же вы запускаете VisualVM на другом компьютере или VisualVM не смог обнаружить процесс WFE (это обычная ситуация, если эти программы запущены под разными пользователями), то нужно произвести настройки: в run.bat (Windows) или run.sh (Linux) нужно добавить параметры в JAVA_OPTS. Например так:
set JAVA_OPTS=%JAVA_OPTS% -Dcom.sun.management.jmxremote.port=6767 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false
После этого убедиться, что порт 6767 не закрыт с помощью Firewall.
VisualVM соединится путем JMX Connection.
После успешного соединения по правой кнопке мыши на выбранном процессе будут доступны элементы меню Thread Dump, Heap Dump. Также с помощью этого инструмента можно понаблюдать за процессом, но не советуем оставлять надолго соединение активным в режиме эксплуатации, т.к. происходит постоянная пересылка данных JVM в VisualVM.
# Настройки среды для узлов-сообщений
# В Jboss версии 4
Используется JbossMessaging, все возможности настройки можно узнать из оригинала http://www.jboss.org/jbossmessaging.
Основные настройки в файле runawfe.ear!/runawfe-jms-service.xml:
- параметр /server/mbean/attribute[name="DefaultMaxDeliveryAttempts"] максимальное кол-во попыток отправки сообщений при отсутствии получателя
- параметр /server/mbean/attribute[name="DefaultRedeliveryDelay"] задержка повторной отправки сообщения при отсутствии получателя.
При параметрах DefaultMaxDeliveryAttempts=43200, DefaultRedeliveryDelay=60000 время жизни сообщения будет 1 месяц, задержка между обработкой (в случае неактивного узла "получить сообщение") 1 мин.
# В wildfly/Jboss версии 7
При использовании HornetMQ все возможности настройки можно узнать из оригинала http://www.jboss.org/hornetq/docs.
# Другие настройки
# Длительность активной пользовательской сессии
Для изменения длительности активной пользовательской сессии в браузере по умолчанию (30 минут) в ${RunaWFE}/server/default/deploy/wfe.war!/WEB-INF/web.xml добавьте в элемент <web-app>:
<session-config> <session-timeout>N</session-timeout> </session-config>
где N - количество минут.
# Оповещение пользователей по электронной почте
В RunaWFE есть возможность настроить оповещение пользователей о поступивших и просроченных заданиях.
Для этого необходимо определить конфигурацию отправки email-сообщения.
Содержимое email.config.xml (формат конфигурации аналогичен обработчику):
<?xml version="1.0" encoding="UTF-8"?> <email-config> <common> <param name="throwErrorOnFailure" value="true"/> </common> <headers> <param name="From" value="SMTPbot@robots.runa.ru"/> <param name="To" value="${task.executor.email}"/> </headers> <connection> <param name="mail.transport.protocol" value="smtp"/> <param name="mail.host" value="172.16.100.7"/> <param name="mail.smtp.port" value="25"/> <param name="mail.smtp.auth" value="true"/> <param name="mail.user" value="username"/> <param name="mail.password" value="password"/> </connection> <message> <param name="bodyInlined" value="false"/> <body> <![CDATA[ Process - ${task.process.deployment.name}, Task - ${task.name} ]]> </body> </message> </email-config>
Для отправки сообщений о поступивших заданиях необходимо в wfe.custom.system.context.xml определить ru.runa.wfe.task.EmailTaskNotifier.
Пример настройки:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:jee="http://www.springframework.org/schema/jee" xmlns:context="http://www.springframework.org/schema/context" xmlns:task="http://www.springframework.org/schema/task" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.5.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.0.xsd"> <bean class="ru.runa.wfe.task.EmailTaskNotifier"> <property name="configLocation" value="email.config.xml" /> <property name="onlyIfTaskActorEmailDefined" value="true" /> <property name="includeProcessNameFilter"> <list> <value>process1</value> <value>process2</value> </list> </property> <property name="excludeEmailsFilter"> <list> <value>ignore@sample.org</value> <value>*@mail.ru</value> </list> </property> </bean> </beans>
Для отправки сообщений о просроченных заданиях необходимо в wfe.custom.system.context.xml определить job ru.runa.wfe.job.impl.ExpiredTasksNotifier.
Пример настройки:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:jee="http://www.springframework.org/schema/jee" xmlns:context="http://www.springframework.org/schema/context" xmlns:task="http://www.springframework.org/schema/task" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.5.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.0.xsd"> <bean id="expiredTasksNotifier" class="ru.runa.wfe.job.impl.ExpiredTasksNotifier"> <property name="scheduledTimerTaskPeriod" value="60000" /> <property name="configLocation" value="expired.email.config.xml" /> <property name="onlyIfTaskActorEmailDefined" value="true" /> <property name="includeProcessNameFilter"> <list> <value>process1</value> <value>process2</value> </list> </property> <property name="excludeEmailsFilter"> <list> <value>ignore@sample.org</value> <value>*@mail.ru</value> </list> </property> </bean> <task:scheduler id="expiredTasksNotifierScheduler" /> <task:scheduled-tasks scheduler="expiredTasksNotifierScheduler"> <task:scheduled ref="expiredTasksNotifier" method="execute" fixed-delay="60000" /> </task:scheduled-tasks> </beans>
где:
- configLocation (обязательный) - путь к конфигурации отправки email сообщения
- enabled (по умолчанию = true) - задействовать уведомления
- onlyIfTaskActorEmailDefined (по умолчанию = false) - посылать уведомления по заданиям, назначенным только пользователям с установленным адресом электронной почты
- includeEmailsFilter 4.3.0+ - список email для включения в рассылку, допускаются подстановочные символы
- excludeEmailsFilter4.3.0+ - список email для исключения из рассылки, допускаются подстановочные символы
- includeProcessNameFilter 4.3.0+ - список названий БП для включения в рассылку, допускаются подстановочные символы
- excludeProcessNameFilter 4.3.0+ - список названий БП исключения из рассылки, допускаются подстановочные символы.
Подстановочные символы: * - любой набор символов, ? - любой символ.
# Что можно использовать в теле сообщения
В теле сообщения можно использовать все переменные БП по скриптовому названию.
В теле сообщения также доступны контекстные переменные:
Интерактивная форма (${interaction}, ru.runa.wfe.form.Interaction)
Использовать проверку в браузере ${interaction.useJSValidation?string("да", "нет")} Список обязательных переменных ${interaction.requiredVariableNames} Код формы ${interaction.formData} (byte[])
Получатели уведомления (${emails}, java.lang.String)
Формируется из корректных email пользователей, на которых назначается задание (их может быть несколько, если задание назначается на группу).
Задание (${task}, ru.runa.wfe.task.Task)
ID ${task.id} ID задания ${task.nodeId} Название ${task.name} Описание ${task.description} Название роли ${task.swimlane.name} Исполнитель ${task.executor.label} Дата создания ${task.createDate?datetime} Срок выполнения (deadline) ${task.deadlineDate?datetime}
Экземпляр процесса (${task.process}, ru.runa.wfe.execution.Process)
ID ${task.process.id} Дата запуска ${task.process.startDate?datetime} Дата завершения ${task.process.endDate?datetime} (только для асинхронных заданий) Иерархия подпроцессов ${task.process.hierarchyIds}
Определение процесса (${task.process.deployment}, ru.runa.wfe.definition.Deployment)
ID ${task.process.deployment.id} Версия ${task.process.deployment.version} Название ${task.process.deployment.name} Описание ${task.process.deployment.description} Категория ${task.process.deployment.category} Загружено в систему ${task.process.deployment.createDate?datetime}
# Логирование HTTP запросов
# В Jboss версии 7
Поместить Файл:Jboss-web.xml в runawfe.ear!/wfe-web-x.y.z.war!/META-INF (переменовать в jboss-web.xml).
# Логирование
Настройки по умолчанию в системе обеспечивают следующее:
- boot.log – информация о загрузке
- server.log.* – основные логи, генерируемые во время работы системы.
Настраивается в файле standalone.xml по документации https://docs.jboss.org/author/display/AS71/Logging+Configuration .
# Настройка логирования с ограничением по размеру
Для включения возможности нужно настроить https://docs.jboss.org/author/display/AS71/Logging+Configuration#LoggingConfiguration-sizerotatingfilehandler .
Пример для ограничения директории с логами в 1Гб:
<size-rotating-file-handler name="FILE"> <level name="DEBUG"/> <formatter> <pattern-formatter pattern="%d{HH:mm:ss,SSS} %-5p [%c] (%t) %s%E%n"/> </formatter> <file relative-to="jboss.server.log.dir" path="server.log"/> <rotate-size value="100m"/> <max-backup-index value="10"/> <append value="true"/> </size-rotating-file-handler>
# Настройка архивирования логов
Настраивается внешними средствами ОС.
В Linux можно использовать crontab, в Windows планировщик задач.
Делается исполняемый файл (sh или bat), в котором старые логи перемещаются в архивную папку с архивированием.
Пример файла для linux:
#!/bin/bash find /opt/jboss/standalone/log/ -iname "server.log.*" -not -name "*.gz" -mtime +7 -exec gzip "{}" \; mv /opt/jboss/standalone/log/*gz /opt/jboss/standalone/log/old/
Замечания (Николай Васильев)
- В главе 1 находятся 2 замечания (Note), в которых не согласуются падежи. Надо это пригладить.