«1. Обзор
В нашей предыдущей вводной статье Activiti с Java мы увидели важность ProcessEngine и создали его с помощью статического API по умолчанию, предоставляемого фреймворком.
Помимо стандартного, существуют и другие способы создания ProcessEngine, которые мы рассмотрим здесь.
2. Получение экземпляра ProcessEngine
Есть два способа получить экземпляр ProcessEngine:
- using the ProcessEngines class
- programmatically, via the 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.
- Using XML Config
- Using Java Config
Как упоминалось в разделе 2.1. — мы можем программно определить ProcessEngineConfiguration и построить ProcessEngine, используя этот экземпляр: () API.
В этом случае искомое имя bean-компонента по умолчанию — processEngineConfiguration. Если мы хотим изменить имя файла конфигурации или имя компонента, мы можем использовать другие доступные методы для создания файла ProcessEngineConfiguration.
@Test
public void givenXMLConfig_whenCreateDefaultConfiguration_thenGotProcessEngine() {
ProcessEngineConfiguration processEngineConfiguration
= ProcessEngineConfiguration
.createProcessEngineConfigurationFromResourceDefault();
ProcessEngine processEngine
= processEngineConfiguration.buildProcessEngine();
assertNotNull(processEngine);
assertEquals("root", processEngine.getProcessEngineConfiguration()
.getJdbcUsername());
}
Давайте посмотрим на несколько примеров.
Во-первых, мы изменим имя файла конфигурации и попросим API использовать наш пользовательский файл:
Теперь давайте также изменим имя компонента:
Конечно, теперь, когда конфигурация ожидает разные имена, нам нужно изменить имя файла (и имя компонента), чтобы оно совпадало — перед запуском теста.
@Test
public void givenDifferentNameXMLConfig_whenGetProcessEngineConfig_thenGotResult() {
ProcessEngineConfiguration processEngineConfiguration
= ProcessEngineConfiguration
.createProcessEngineConfigurationFromResource(
"my.activiti.cfg.xml");
ProcessEngine processEngine = processEngineConfiguration
.buildProcessEngine();
assertNotNull(processEngine);
assertEquals("baeldung", processEngine.getProcessEngineConfiguration()
.getJdbcUsername());
}
Другими доступными параметрами для создания движка являются createProcessEngineConfigurationFromInputStream(InputStream inputStream), createProcessEngineConfigurationFromInputStream(InputStream inputStream, String beanName).
@Test
public void givenDifferentBeanNameInXMLConfig_whenGetProcessEngineConfig_thenGotResult() {
ProcessEngineConfiguration processEngineConfiguration
= ProcessEngineConfiguration
.createProcessEngineConfigurationFromResource(
"my.activiti.cfg.xml",
"myProcessEngineConfiguration");
ProcessEngine processEngine = processEngineConfiguration
.buildProcessEngine();
assertNotNull(processEngine);
assertEquals("baeldung", processEngine.getProcessEngineConfiguration()
.getJdbcUsername());
}
Если мы не хотим использовать конфигурацию XML, мы также можем настроить все, используя только конфигурацию Java.
Мы будем работать с четырьмя разными классами; каждый из них представляет различную среду:
Давайте рассмотрим несколько примеров.
Вот тест JUnit для создания автономной конфигурации механизма обработки:
- org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration – the ProcessEngine is used in a standalone way, backed by the DB
- org.activiti.engine.impl.cfg.StandaloneInMemProcessEngineConfiguration – by default, an H2 in-memory database is used. The DB is created and dropped when the engine starts and shuts down – hence, this configuration style can be used for testing
- org.activiti.spring.SpringProcessEngineConfiguration – to be used in Spring environment
- org.activiti.engine.impl.cfg.JtaProcessEngineConfiguration – the engine runs in standalone mode, with JTA transactions
Аналогичным образом мы напишем тестовый пример JUnit для создания автономной конфигурации механизма обработки с использованием базы данных в памяти:
~ ~~ 5. Настройка базы данных
@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());
}
По умолчанию Activiti API будет использовать базу данных H2 в памяти с именем базы данных «activiti» и именем пользователя «sa».
@Test
public void givenNoXMLConfig_whenCreateInMemProcessEngineConfig_thenCreated() {
ProcessEngineConfiguration processEngineConfiguration
= ProcessEngineConfiguration
.createStandaloneInMemProcessEngineConfiguration();
ProcessEngine processEngine = processEngineConfiguration
.buildProcessEngine();
assertNotNull(processEngine);
assertEquals("sa", processEngine.getProcessEngineConfiguration()
.getJdbcUsername());
}
Если нам нужно использовать какую-либо другую базу данных, нам придется настроить ее явно — используя два основных свойства.
databaseType — допустимые значения: h2, mysql, oracle, postgres, mssql, db2. Это также можно выяснить из конфигурации БД, но это будет полезно, если автоматическое обнаружение не работает.
databaseSchemaUpdate — это свойство позволяет нам определить, что происходит с базой данных, когда движок загружается или выключается. Он может иметь следующие три значения:
Мы можем определить конфигурацию БД как свойства JDBC:
В качестве альтернативы, если мы используем DataSource:
- false (default) – this option validates the version of database schema against the library. The engine will throw an exception if they do not match
- true – when the process engine configuration is built, a check is performed on the database. The database will be created/updated create-drop accordingly
- “–” – this will create the DB schema when the process engine is created and will drop it when the process engine shuts down.
6. Заключение
<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" />
В этом кратком руководстве , мы сосредоточились на нескольких различных способах создания ProcessEngine в Activiti.
<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>
Мы также видели различные свойства и подходы к настройке базы данных.
Как всегда, код примеров, которые мы видели, можно найти на GitHub.
«
As always, the code for examples we saw can be found over on GitHub.