1. Обзор
В нашей предыдущей вводной статье Activiti с Java мы увидели важность ProcessEngine
и создали его с помощью статического API по умолчанию, предоставляемого фреймворком.
Помимо стандартного, существуют и другие способы создания ProcessEngine
, которые мы рассмотрим здесь.
2. Получение экземпляра ProcessEngine
Есть два способа получить экземпляр ProcessEngine
:
- с помощью класса
ProcessEngines
- программно, через
ProcessEngineConfiguration
Давайте подробнее рассмотрим примеры для обоих этих подходов.
3. Получите ProcessEngine
с помощью класса ProcessEngines
Как правило, ProcessEngine
настраивается с использованием XML-файла с именем activiti.cfg.xml,
который также будет использоваться процессом создания по умолчанию.
Вот краткий пример того, как может выглядеть эта конфигурация:
<beans xmlns="...">
<bean id="processEngineConfiguration" class=
"org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
<property name="jdbcUrl"
vasentence you have mentioned and also changed thelue="jdbc:h2:mem:activiti;DB_CLOSE_DELAY=1000" />
<property name="jdbcDriver" value="org.h2.Driver" />
<property name="jdbcUsername" value="root" />
<property name="jdbcPassword" value="" />
<property name="databaseSchemaUpdate" value="true" />
</bean>
</beans>
Обратите внимание, как здесь настроен аспект постоянства движка.
И теперь мы можем получить ProcessEngine
:
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
4. Получите ProcessEngine
с помощью ProcessEngineConfiguration
Отклоняемся от маршрута получения движка по умолчанию — есть два способа создания ProcessEngineConfiguration
:
- Использование XML-конфигурации
- Использование конфигурации Java
Начнем с конфигурации XML.
Как упоминалось в разделе 2.1. — мы можем программно определить ProcessEngineConfiguration
и построить ProcessEngine
, используя этот экземпляр:
@Test
public void givenXMLConfig_whenCreateDefaultConfiguration_thenGotProcessEngine() {
ProcessEngineConfiguration processEngineConfiguration
= ProcessEngineConfiguration
.createProcessEngineConfigurationFromResourceDefault();
ProcessEngine processEngine
= processEngineConfiguration.buildProcessEngine();
assertNotNull(processEngine);
assertEquals("root", processEngine.getProcessEngineConfiguration()
.getJdbcUsername());
}
Метод createProcessEngineConfigurationFromResourceDefault()
также будет искать файл activiti.cfg.xml
, и теперь нам нужно только вызвать API buildProcessEngine()
.
В этом случае имя компонента по умолчанию, которое он ищет, — это processEngineConfiguration
. Если мы хотим изменить имя файла конфигурации или имя компонента, мы можем использовать другие доступные методы для создания файла ProcessEngineConfiguration.
Давайте посмотрим на несколько примеров.
Во-первых, мы изменим имя файла конфигурации и попросим API использовать наш пользовательский файл:
@Test
public void givenDifferentNameXMLConfig_whenGetProcessEngineConfig_thenGotResult() {
ProcessEngineConfiguration processEngineConfiguration
= ProcessEngineConfiguration
.createProcessEngineConfigurationFromResource(
"my.activiti.cfg.xml");
ProcessEngine processEngine = processEngineConfiguration
.buildProcessEngine();
assertNotNull(processEngine);
assertEquals("foreach", processEngine.getProcessEngineConfiguration()
.getJdbcUsername());
}
Теперь давайте также изменим имя компонента:
@Test
public void givenDifferentBeanNameInXMLConfig_whenGetProcessEngineConfig_thenGotResult() {
ProcessEngineConfiguration processEngineConfiguration
= ProcessEngineConfiguration
.createProcessEngineConfigurationFromResource(
"my.activiti.cfg.xml",
"myProcessEngineConfiguration");
ProcessEngine processEngine = processEngineConfiguration
.buildProcessEngine();
assertNotNull(processEngine);
assertEquals("foreach", processEngine.getProcessEngineConfiguration()
.getJdbcUsername());
}
Конечно, теперь, когда конфигурация ожидает разные имена, нам нужно изменить имя файла (и имя компонента), чтобы оно совпадало — перед запуском теста.
Другими доступными параметрами для создания механизма являются createProcessEngineConfigurationFromInputStream(InputStream inputStream),
createProcessEngineConfigurationFromInputStream(InputStream inputStream, String beanName)
.
Если мы не хотим использовать конфигурацию XML, мы также можем настроить все, используя только конфигурацию Java .
Мы будем работать с четырьмя разными классами; каждый из них представляет другую среду:
org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration —
ProcessEngineиспользуется
автономно, при поддержке БДorg.activiti.engine.impl.cfg.StandaloneInMemProcessEngineConfiguration —
по умолчанию используется база данных H2 в памяти. БД создается и удаляется при запуске и выключении двигателя, следовательно, этот стиль конфигурации можно использовать для тестирования.org.activiti.spring.SpringProcessEngineConfiguration —
для использования в среде Springorg.activiti.engine.impl.cfg.JtaProcessEngineConfiguration —
движок работает в автономном режиме с транзакциями JTA
Давайте рассмотрим несколько примеров.
Вот тест JUnit для создания автономной конфигурации механизма обработки:
@Test
public void givenNoXMLConfig_whenCreateProcessEngineConfig_thenCreated() {
ProcessEngineConfiguration processEngineConfiguration
= ProcessEngineConfiguration
.createStandaloneProcessEngineConfiguration();
ProcessEngine processEngine = processEngineConfiguration
.setDatabaseSchemaUpdate(ProcessEngineConfiguration
.DB_SCHEMA_UPDATE_TRUE)
.setJdbcUrl("jdbc:h2:mem:my-own-db;DB_CLOSE_DELAY=1000")
.buildProcessEngine();
assertNotNull(processEngine);
assertEquals("sa", processEngine.getProcessEngineConfiguration()
.getJdbcUsername());
}
Точно так же мы напишем тестовый пример JUnit для создания автономной конфигурации механизма обработки с использованием базы данных в памяти:
@Test
public void givenNoXMLConfig_whenCreateInMemProcessEngineConfig_thenCreated() {
ProcessEngineConfiguration processEngineConfiguration
= ProcessEngineConfiguration
.createStandaloneInMemProcessEngineConfiguration();
ProcessEngine processEngine = processEngineConfiguration
.buildProcessEngine();
assertNotNull(processEngine);
assertEquals("sa", processEngine.getProcessEngineConfiguration()
.getJdbcUsername());
}
5. Настройка базы данных
По умолчанию Activiti API будет использовать базу данных H2 в памяти с именем базы данных «activiti» и именем пользователя «sa».
Если нам нужно использовать какую-либо другую базу данных, нам придется настроить все явно — используя два основных свойства.
databaseType
— допустимые значения: h2, mysql, oracle, postgres, mssql, db2
. Это также можно выяснить из конфигурации БД, но это будет полезно, если автоматическое обнаружение не работает.
databaseSchemaUpdate —
это свойство позволяет нам определить, что происходит с базой данных, когда движок загружается или выключается. Он может иметь следующие три значения:
false
(по умолчанию) — этот параметр проверяет версию схемы базы данных на соответствие библиотеке. Движок выдаст исключение, если они не совпадаютtrue
— при построении конфигурации движка процесса выполняется проверка базы данных. База данных будет создана/обновлена create-drop соответственно- «
-
» — это создаст схему БД при создании механизма процесса и удалит ее при завершении работы механизма процесса.
Мы можем определить конфигурацию БД как свойства JDBC:
<property name="jdbcUrl" value="jdbc:h2:mem:activiti;DB_CLOSE_DELAY=1000" />
<property name="jdbcDriver" value="org.h2.Driver" />
<property name="jdbcUsername" value="sa" />
<property name="jdbcPassword" value="" />
<property name="databaseType" value="mysql" />
В качестве альтернативы, если мы используем DataSource
:
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" >
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/activiti" />
<property name="username" value="activiti" />
<property name="password" value="activiti" />
<property name="defaultAutoCommit" value="false" />
<property name="databaseType" value="mysql" />
</bean>
6. Заключение
В этом кратком руководстве мы сосредоточились на нескольких различных способах создания ProcessEngine
в Activiti.
Мы также увидели различные свойства и подходы к настройке базы данных.
Как всегда, код примеров, которые мы видели, можно найти на GitHub .