ServerConfigurationGuide

Материал из RunaWFE
Перейти к навигации Перейти к поиску

Сервер. Руководство по настройке

Версия 4.5.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 по совпадающим ключам.

Пример файла, определяющего тип соединения с MSSQL Server wfe.custom.database.properties:

hibernate.connection.datasource=java:/mssqlds
hibernate.dialect=ru.runa.wfe.commons.hibernate.SqlServerUnicodeDialect

# Примеры переопределения настроек, определенных в properties файлах

Пример включения возможности изменения значений переменных экземпляра БП.

За эту возможность отвечает настройка executionServiceAPI.updateVariables.enabled, которая по умолчанию имеет значение false 4.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


Замечание. Переопределенные настройки применяются только после перезапуска сервера.

Если все было выполнено верно, то в свойствах экземпляра процесса, в секции "Переменные процесса" должна появиться ссылка "Изменить значение", как показано на следующем рисунке.


UpdateVariabless.png


По ссылке будет открыт интерфейс для изменения значения переменных экземпляра БП

UpdateVariabless2.png



Пример включения административного назначения роли.

Данная возможность позволяет разрешить изменение исполнителя в экземпляре процесса, параметр отвечающий за это - 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


Замечание. Переопределенные настройки применяются только после перезапуска сервера.

Если все было выполнено верно, то в свойствах экземпляра процесса, в секции "Роли процесса" появится ссылка "Изменить исполнителя"

SwimlaneAssign1.png


По ссылке будет открыт интерфейс для изменения исполнителя

SwimlaneAssign2.png

# Правило расширения настроек, определенных в 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
логин администратора, создаваемый при первом запуске системы Administrator
default.administrator.password
пароль администратора, устанавливаемый при первом запуске системы wf
default.administrators.group.name
название группы администраторов, создаваемая при первом запуске системы Administrators
default.bots.group.name
название группы ботов, создаваемая при первом запуске системы Bots
strong.passwords.regexp
для усиления защиты системы можно наложить ограничения на пароли пользователей системы. Если определен этот параметр, то все заводимые пароли пользователей должны соответствовать регулярному выражению. Если пароль не отвечает требованиям безопасности, то смена пароля произведена не будет. отсутствует
escalation.enabled
эскалация заданий включена? true
escalation.default.hierarchy.loader

(до версии 4.1.1 escalation.default.orgFunction)

орг. функция или отношение, для определения иерархии эскалации заданий ru.runa.wfe.extension.orgfunction.TestOrgFunction (фиктивная орг. функция)

Значением может быть либо полное название класса орг. функции, либо отношение в формате @relationName. Обратное отношение задаётся в формате @!relationName.

task.default.deadline
время исполнения задания по умолчанию (если не установлено явно в Среде разработки) 2 hours
task.almostDeadlinePercents
процент истечения времени исполнения после которого цвет задания в списке меняется на более приоритетный 90
task.delegation.enabled
Включить делегирование задач true (переехала из web.properties 4.4.1+)
authentication.domain.name
имя домена TEST
date.format.pattern
формат даты в системе (также используется при форматировании даты со временем) ДД.ММ.ГГГГ
executionServiceAPI.updateVariables.enabled
разрешить выполнение метода ru.runa.wfe.service.impl.ExecutionServiceBean.updateVariables(User, Long, Map<String, Object>) false 4.1.2+, true 4.1.2-, переехала в web.properties 4.4.0+
scriptingServiceAPI.executeGroovyScript.enabled
разрешить выполнение метода ru.runa.wfe.service.ScriptingService.executeGroovyScript(User, String) false
token.maximum.depth
максимально разрешенная вложенность токенов, для предотвращения логических циклических ошибок в параллельном шлюзе 100
token.maximum.length 4.4.1+
максимально разрешенная длина (количество переходов) токенов, для предотвращения логических циклических ошибок -1
file.variable.local.storage.enabled
разрешить использование локального хранилища в файловой системе для больших файлов true
file.variable.local.storage.path
путь к директории-хранилищу директория wfe.filedata внутри сервера
file.variable.local.storage.enableforfilesgreaterthan
если размер файловой переменной превышает установленный - то файл сохраняется в файловой системе, а не в БД 100000
string.variable.length
значение длины строковой переменной, изменять не рекомендуется! 1024
ear.filename
изменять в случае сборки собственного EAR runawfe.ear
undefined.variables.allowed
разрешить создание в процессе переменных, не определенных в Среде разработки? false
strong.variables.format.enabled
режим строгой типизации. Требовать соответствие типа определенному в Среде разработки при установке значений переменных true
variables.autocast.enabled
выполнять приведение типа к определенному в Среде разработки в случае несоответствия типа значения переменной в режиме строгой типизации true
timertask.period.millis.job.execution 4.0.6+
период обнаружения просроченных таймеров всех процессов, в миллисекундах 60000
timertask.start.millis.job.execution 4.0.6+
задержка перед первым выполнением просроченных таймеров всех процессов после запуска системы, в миллисекундах 60000
job.executor.batch.size 4.4.3+
количество обрабатываемых просроченных таймеров в одной транзакции 50
timertask.period.millis.unassigned.tasks.execution 4.0.6+
период между обнаружением не назначенных заданий (и попыткой их назначения), в миллисекундах 60000 4.2.0+ (600000 4.2.0-)
timertask.start.millis.unassigned.tasks.execution 4.0.6+
задержка перед первым обнаружением не назначенных заданий (и попыткой их назначения) после запуска системы, в миллисекундах 60000
timertask.period.millis.remove.temp.groups 4.3.0+
период между очистками временных групп, в миллисекундах 10800000
timertask.start.millis.remove.temp.groups 4.3.0+
задержка перед первым выполнением очистки временных групп после запуска системы, в миллисекундах 600000
receive.message.handle.in.sequence.enabled
только в 4.1.0, см. описание true
trusted.authentication.enabled 4.2.0+
Разрешена ли доверенная аутентификация с помощью сервисного аккаунта (AuthenticationService.authenticateByTrsustedPrincipal(User, String)) false
upgrade.process.to.definition.version.enabled 4.3.0+
Разрешено ли обновление версии исполняющегося процесса на другое по версии (полезно для исправления блокирующих ошибок, может иметь непредсказуемые ошибки в случае если определение процесса сильно отличается от текущего) true (upgrade.process.to.next.definition.version.enabled = false 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 базового БП" ко всем переменным. true
base.process.id.mapping.variable.prefix
Только в 4.3.0, не вошло в релиз. Определяло соответсвие переменных для режима "ID базового БП"
temporary.groups.set.permissions 4.3.0+
Выдавать ли полномочия на чтение создаваемой временной группе всем её участникам. false (до версии 4.3.0 было поведение, аналогичное значению true)
temporary.groups.delete.on.process.end 4.3.0+
Удалять временные группы по завершению БП. Если не удалять - то это будет сделано (по умолчанию включено) с помощью периодической задачи чистки неиспользуемых временных групп. false
temporary.groups.delete.on.task.end 4.3.0+
Удалять временную группу, на которую назначено задание, при его завершении. Если не удалять - то это будет сделано (по умолчанию включено) с помощью периодической задачи чистки неиспользуемых временных групп. false
freemarker.static.class.names 4.3.0+
Список классов, которые доступны по механизму BeansWrapper.getStaticModels() в шаблонах freemarker не задано
process.suspension.enabled 4.3.0+
Разрешить ручную приостановку БП администратором системы. true
process.execution.node.async.default 4.3.0+
По умолчанию использовать новую транзакцию для выполнения узлов, подробнее true
process.execution.node.async.NodeType 4.3.0+
Использовать новую транзакцию для выполнения узлов определённого типа по умолчанию, подробнее не заданы
process.swimlane.auto.initialization.enabled 4.3.0+
Разрешить авто-инициализацию роли при доступе к ней как к переменной. false
check.process.start.permissions 4.3.0+
Проверять права на запуск БП. Используется только в случае интеграции со сторонней подсистемой полномочий. true
definition.comments.empty.allowed 4.3.0+
Разрешить загрузку определения процесса, в котором нет новых комментариев. true
definition.comments.collisions.allowed 4.3.0+
Разрешить загрузку определения процесса, в котором отсутствуют некоторые комментарии из прежней версии определения. false
process.execution.message.predefined.selector.enabled 4.3.0+
Использовать ли для обработки узлов-сигналов предвычисленное значение селектора? Использование улучшает производительность обработки сигналов, но накладывает ограничение: значение селектора вычисляется на момент прихода точки управления в узел-приёмник и не изменяется при изменении значения участвующих в нём переменных. true
process.execution.message.predefined.selector.only.strict.compliance.handling 4.3.0+
В случае использования предвычисленного значения селектора таблицы маршрутизации: использовать только прямое соответствие? В случае прямого соответствия таблицы маршрутизации узлов отправителя и получателя должны полностью совпадать (что накладывает функциональные ограничения на работу сигналов), но получается выигрыш по производительности. false
variables.invalid.default.values.allowed 4.4.0+
Допускать загрузку БП в систему, имеющих некорректные значения переменных по умолчанию. false (true - до версии 4.3.0 и для БП, загруженных до даты, см. след. настройку)
variables.invalid.default.values.allowed.before 4.4.0+
Дата, начиная с которой действует настройка variables.invalid.default.values.allowed. Использовать стоит только для обратной совместимости ранее загруженных БП. 01.01.1970

# Управление полями представлений (class.presentation.properties)

Поля представлений, используемых при отображении списка объектов настраиваются и могут находится в 3 состояниях: ENABLED, DISABLED и HIDDEN. По умолчанию все поля находятся в состоянии ENABLED.

В состоянии ENABLED поле представления отображается в таблице при раскрытии представления. Фильтрация, сортировка и группировка по полю доступны для изменения пользователем и имеют ожидаемый эффект.

В состоянии HIDDEN поле представления не отображается в таблице при раскрытии представления. Фильтрация, сортировка и группировка по полю не доступны для изменения пользователем но имеют эффект в системе. Таким образом, если в поле на момент перевода в состояние HIDDEN установлена фильтрация, то фильтрация по полю продолжит применяться при отображении списка объектов. Поля в состоянии HIDDEN наиболее разумно использовать в соединении с автоматическим проставлением свойств поля для установления одинакового вида представления у всех пользователей. Если поле необходимо только убрать из отображения, что бы оно не влияло на систему, то используйте состояние DISABLED.

В состоянии DISABLED поле представления не отображается в таблице при раскрытии представления. Фильтрация, сортировка и группировка по полю не доступны для изменения пользователем и не имеют никакого эффекта в системе. Таким образом, если в поле на момент перевода в состояние DISABLED установлена фильтрация, то фильтрация по полю не будет применяться при отображении списка объектов.

В конфигурационном файле уже прописаны по умолчанию все поля, которые могут быть настроены в системе, и установлены в состояние ENABLED.

# Настройка веб-интерфейса (web.properties)

название описание значение по умолчанию
group.subprocess.enabled
доступна ли группировка по подпроцессам в фильтре? true
task.form.autoShowNext
автоматически показывать форму следующего задания (в том же токене) false
task.form.highlightRequiredFields
обозначать обязательные поля на форме задания true
task.form.ajaxFileInputEnabled
использовать в качестве элемента загрузки файла (обеспечивает сохранение загруженного файла при неуспешной проверке данных и возможность очистки файла) не стандартный элемент ввода (используется jquery file upload). Поддержка браузерами: IE8+, Firefox, Chrome true
task.form.external.js.libs 4.2.0+
использовать внешние библиотеки javascript в формах заданий (значения разделяются точкой с запятой) отсутствует
view.logs.limit.lines.count
максимальное количество отображаемых строк лога 10000
view.logs.timeout.autoreload.seconds
таймаут перезагрузки лога на странице просмотра логов 15
process.graph.autoRefreshInterval.seconds
таймаут для авто-перезагрузки графа процесса 15
process.showGraphMode
реализовано два режима просмотра:

1) false. Граф и свойства бизнес-процесса расположены на одной странице. 2) true. Граф и свойства бизнес-процесса разнесены на две разные страницы и переход между ними осуществляется по ссылке в правом верхнем углу страницы.

false
process.variables.displayJavaType
отображать java-тип переменной в списке переменных процесса false
ntlm.enabled
разрешить аутентификацию по NTLM в вебе? false
ntlm.domain
название домена MYDOMAIN
confirmation.*
требовать ли подтверждения пользовательских действий? по контексту
menu.additional_links класс-провайдер дополнительных ссылок, см. ru.runa.common.WebResources.getAdditionalLinks() отсутствует
process.definition.ajax.bulk.deployment.enabled 4.2.0+
множественная загрузка определений процессов true
process.removal.enabled 4.2.0+
возможность удаления остановленного процесса администратором false
task.delegation.enabled 4.2.0+
включить делегирование задач true (false 4.3.0-), переехала в system.properties 4.4.1+
process.swimlane.assignment.enabled 4.3.0+
включить административное назначение роли false 4.4.0-, true 4.4.0+
process.variable.assignment.enabled 4.4.0+
включить административное редактирование переменных true
process.task.filters.enabled 4.3.0+
включить использование фильтров по атрибутам задач в списке запущенных процессов false
import.export.enabled 4.3.0+
включить импорт/экспорт данных через файл true

# Настройка работы с приложениями Office (office.properties)

название описание значение по умолчанию
docx.placeholder.start
начало управляющей последовательности символов <4.1.0-

${4.1.0+

docx.placeholder.end
окончание управляющей последовательности символов >4.1.0-

}4.1.0+

docx.element.start
символ указания начала элемента контейнера4.3.0- [
docx.element.end
символ указания окончания элемента контейнера4.3.0- ]
docx.placeholder.vmerge
символ для объединения ячейки таблицы по вертикали4.4.0+ -||-

# Настройка графа процесса (graph.properties)

название описание значение по умолчанию
edgingOnly
рисовать только рамки поверх скриншота из Среды разработки (иначе - полная генерация картинки) true
backgroundColor
цвет фона 0xF0FFFF
figureBackgroundColor
цвет фона элемента 0x009900
activeFigureBackgroundColor
цвет фона активного элемента 0xFFFF66
baseColor
цвет рисования элементов 0x000000
textColor
цвет текста 0x000000
transitionColor
цвет рисования переходов 0xCCCCCC
highlightColor
цвет рисования задействованных элементов и переходов 0x009900
alarmColor
цвет просроченных заданий 0xFF3333
lightAlarmColor
цвет заданий, почти просроченных 0x996633
fontSize
размер шрифта (только в режиме полной отрисовки) 9
fontFamily
шрифт (только в режиме полной отрисовки) Verdana
bpmn.showSwimlane
рисовать название ролей на графе (только в режиме полной отрисовки) true
logs.enabled
показывать историю выполнения процесса на графе true

# Настройки бизнес-календаря (business.calendar.properties)

См. статью о бизнес-календаре

# Настройки кеширования (cache.properties)

В системе существуют кешы на уровне логики некоторых сущностей: список заданий, правила замещения, исполнители, определения процессов. Они хранят информацию в сложных структурах, например: список заданий по пользователям (с учетом замещений), пользователи групп, последние версии определений процессов и т.п.

По умолчанию включен режим работы smart. Он заключается в том что при изменении объекта пересчитывается только затрагиваемая часть кеша.

Кеширование не может быть отключено полностью.

название описание значение по умолчанию
smart_cache
включен режим работы smart true

# Настройки бот станции (botstation.properties)

название описание значение по умолчанию
botstation.invocation.period.seconds
при включенной периодической активации бот станции таймаут между работой ботов, в секундах 300 (3 4.3.1-)
botstation.system.username
логин пользователя с правами на работу с бот станцией Administrator
botstation.system.password
пароль пользователя с правами на работу с бот станцией wf
thread.pool.size
количество потоков, в которых работает бот станция 1
taskhandler.jar.names
поиск обработчиков ботов для списка в веб-интерфейсе осуществляется по этим библиотекам wfe-bots-*.jar;*wfe-core-*.jar;*wfe-office-*.jar
bot.logger.class
дополнительное логирование: класс, реализующий ru.runa.wf.logic.bot.BotLogger отсутствует
botstations.autostart.enabled 4.2.0+
автоматический запуск периодического выполнения всех бот станций при запуске системы false (true 4.3.1-)
botstation.failedExecutionInitialDelaySeconds 4.2.0+
начальное значение задержки после неудачного выполнения задачи бота (следующее удвоится) (в секундах) 30
botstation.failedExecutionMaxDelaySeconds 4.2.0+
максимальное значение задержки после неудачного выполнения задачи бота (в секундах) 7200
botstation.stuck.timeout.minutes 4.3.0+
таймаут, используемый для обнаружения зависших заданий ботов и аварийного их завершения (в минутах) 5

# Настройки соединения по Java API с EJB (ejb.properties)

Если вы используете слой делегатов в wfe-service.jar, то необходимо настроить соединение с EJB.

название описание значение по умолчанию
ejb.type
тип соединения. local для использования локального интерфейса в той же JVM, иначе - remote local
ejb.jndiName.format
формат имени JNDI для получения EJB подставляется с помощью maven из указанного профиля

В случае использования удаленного интерфейса (ejb remote) нужно использовать файл jndi.properties

название описание значение для jboss4 значение для jboss7
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 - true

# Настройки орг. функций для работы с БД (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.

Настройка осуществляется путем:

  1. регистрации класса-драйвера в сервере приложений
  2. регистрации источника данных в сервере приложений
  3. привязки источника данных и установке соответствующего диалекта в database.properties
  4. отдельно настраивается СУБД для хранения сообщений (её не нужно настраивать если в процессах не используются узлы-сообщения или на них не возложена критичная логика). 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.

Настройка осуществляется путем:

  1. создания модуля для jdbc драйвера
  2. регистрации источника данных в standalone.xml (<subsystem xmlns="urn:jboss:domain:datasources:1.0"><datasources>)
  3. привязки источника данных и установке соответствующего диалекта в 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&amp;characterEncoding=UTF-8&amp;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

Для большинства случаев можно:

  1. Выделить максимальное кол-во памяти процессу (-Xmx8GB),
  2. Установить размер памяти (perm gen) в 256M (-XX:MaxPermSize:256m),
  3. Убедиться что используется опция "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 можно:

  1. закомментировав строку hibernate.jdbc.factory_class=net.bull.javamelody.HibernateBatcherFactory в database.properties
  2. в 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/