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

Концепция настроек

Настройки системы разделяются на 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-
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

Управление полями представлений (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

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.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

PostgreSQL

Создайте модуль com.postgresql

Структура модуля:

modules
\
 - system
  \
   - layers
    \
     - base
      \
       - com
        \
         - 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="com.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 установите hibernate.dialect=org.hibernate.dialect.SQLServerDialect (или ru.runa.wfe.commons.hibernate.SQLServerUnicodeDialect), hibernate.connection.datasource=java:/mssqlds

При использовании 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 мин.

В 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/