Расширенный движок рабочего процесса Activiti OpenWebFlow

Hibernate MyBatis SQL модульный тест

Адрес в открытом доступе:git ee.com/blue Joe/ о, квота…(приветственная звезда)

1. Обзор OpenWebFlow

OpenWebFlow — это механизм рабочего процесса, основанный на расширениях Activiti. Активити (официальный сайтactiviti.org/, код размещен по адресуGitHub.com/act IV Вопрос I/AC…) Это новый продукт, основанный на BPM с открытым исходным кодом, поддерживает стандарт Apache BPMN 2.0 по лицензии, это легкий, встраиваемый BPM Engine, а также предоставляет многофункциональные инструменты разработки и проектирования процессов. OpenWebFlow и взаимосвязь между системой бизнес-приложений, как показано на фиг.

По сравнению с Activiti функции, расширенные OpenWebFlow, включают:

1) Полностью взял на себя Activiti управление разрешениями на деятельность.
Activiti позволяет указать полномочия на выполнение каждой операции при проектировании модели, однако бизнес-системе может потребоваться динамическая установка полномочий на выполнение этих задач в соответствии с реальной ситуацией (например, динамическая группа). OpenWebFlow полностью реализует отделение от периода определения процесса, то есть информация о контроле доступа пользователя для действий управляется отдельно (вместо того, чтобы быть предварительно записанной в определении процесса), что способствует динамической настройке разрешений. Пользовательское управление разрешениями на действия;

2) Полностью взял на себя управление пользовательской таблицей Activiti (таблица IDENTITY_XXX).
В стандартном определении рабочего процесса каждый узел может указывать своих кандидатов и группы пользователей-кандидатов, но, к сожалению, Activiti похитила дизайн таблицы с информацией о пользователях! Это действительно фатально, потому что почти каждая бизнес-система будет иметь свою собственную структуру информации о пользователе (включая User/Group/Membership), но она не обязательно хранится в той библиотеке, которая нравится Activiti, и структура таблицы не обязательно будет такой же В то время некоторая информация (например: динамическая группа) вообще не сохраняется в таблице. OpenWebFlow отключает унифицированное управление таблицей информации о пользователях, и клиентская программа может забыть о пользовательской таблице, таблице групп и таблице членства Activiti.Подробности см. в разделе Управление пользовательским членством;

3) Разрешить время выполнения, чтобы определить действия!
Полностью соответствует «китайским характеристикам» и обеспечивает безопасные (и элегантные) функции, такие как побуждение, агентирование, подписание (включая предварительное/после подписания), свободный переход (включая вперед/назад) и разделение узлов;

2. Начните быстро

2.1 Знакомство с инфраструктурой OpenWebFlow

2.1.1 Представление OpenWebFlow в виде jar-файла

Форма выпуска OpenWebFlow представляет собой набор обычных jar-файлов, среди которых openwebflow-core.XXX.jar содержит основной модуль управления рабочим процессом и модуль реализации менеджера на основе памяти.

Кроме того, OpenWebFlow также предоставляет несколько jar-файлов: openwebflow-mgr-hibernate.XXX.jar, openwebflow-mgr-mybatis.XXX.jar, которые предоставляют модуль реализации SQL менеджера, соответственно выбирая hibernate и mybatis в качестве модели ORM. Другой — openwebflow-mgr-test.XXX.jar, содержащий несколько тестовых классов.

Последняя версия адреса загрузки:

https://gitee.com/bluejoe/openwebflow/blob/master/openwebflow-core/target/openwebflow-core-0.9-SNAPSHOT.jar jar с большим вниманием к этим зависимостям, https://gitee.com/bluejoe/openwebflow /tree/master/openwebflow-core/target/lib списки всех зависимостей выглядят следующим образом:

  • activation-1.1.jar
  • activiti-bpmn-converter-5.16.1.jar
  • activiti-bpmn-layout-5.16.1.jar
  • activiti-bpmn-model-5.16.1.jar
  • activiti-crystalball-5.16.1.jar
  • activiti-engine-5.16.1.jar
  • activiti-explorer-5.16.1.jar
  • activiti-image-generator-5.16.1.jar
  • activiti-json-converter-5.16.1.jar
  • activiti-process-validation-5.16.1.jar
  • activiti-simple-workflow-5.16.1.jar
  • activiti-spring-5.16.1.jar
  • aopalliance-1.0.jar
  • commons-collections-2.0.jar
  • commons-dbcp-1.4.jar
  • commons-email-1.2.jar
  • commons-io-2.4.jar
  • commons-lang-2.6.jar
  • commons-lang3-3.3.2.jar
  • commons-logging-1.1.1.jar
  • commons-pool-1.5.4.jar
  • dcharts-widget-0.10.0.jar
  • groovy-all-2.1.3.jar
  • h2-1.3.168.jar
  • hamcrest-core-1.3.jar
  • imgscalr-lib-4.2.jar
  • jackson-annotations-2.2.3.jar
  • jackson-core-2.2.3.jar
  • jackson-databind-2.2.3.jar
  • javaGeom-0.11.1.jar
  • jcl-over-slf4j-1.7.6.jar
  • jgraphx-1.10.4.1.jar
  • joda-time-2.1.jar
  • junit-4.12.jar
  • log4j-1.2.17.jar
  • mail-1.4.1.jar
  • mybatis-3.2.8.jar
  • mybatis-spring-1.2.2.jar
  • mysql-connector-java-5.1.32.jar
  • servlet-api-2.5.jar
  • slf4j-api-1.7.2.jar
  • slf4j-jdk14-1.7.2.jar
  • slf4j-log4j12-1.7.6.jar
  • spring-aop-3.2.4.RELEASE.jar
  • spring-beans-3.2.4.RELEASE.jar
  • spring-context-3.2.4.RELEASE.jar
  • spring-core-3.2.4.RELEASE.jar
  • spring-expression-3.2.4.RELEASE.jar
  • spring-jdbc-3.2.4.RELEASE.jar
  • spring-orm-3.2.4.RELEASE.jar
  • spring-tx-3.2.4.RELEASE.jar
  • spring-web-3.2.4.RELEASE.jar
  • spring-webmvc-3.2.4.RELEASE.jar
  • vaadin-6.8.8.jar

2.1.2 Знакомство с OpenWebFlow от maven

Внедрить OpenWebFlow по пути maven относительно просто, зависимости в pom.xml записываются так:

<dependency>
     <groupId>org.openwebflow</groupId>
     <artifactId>openwebflow-core </artifactId>
     <version>0.9-SNAPSHOT</version>
</dependency>

Перед внедрением зависимостей может потребоваться установить проект OpenWebFlow в локальном репозитории. Конкретная операция заключается в выборе проекта OpenWebFlow в eclipse, [меню правой кнопки мыши] [Maven] [установить].

2.2 Файл конфигурации

Подготовьте файлы конфигурации SpringIoC, а именно settings.properties, activiti.cfg.core.xml и activiti.cfg.mem.xml (или activiti.cfg.sql.XXX.xml):

  • settings.properties: настройки публичного свойства
  • activiti.cfg.core.xml: основная информация о конфигурации для настройки механизма рабочего процесса;
  • activiti.cfg.mem.xml: используется для определения некоторых менеджеров для поддержки работы OpenWebFlow, обратите внимание на mem в имени, это означает, что предоставляется только версия этих менеджеров на основе памяти, и аналогичный файл конфигурации также может быть Активити.cfg.sql.XXX.xml;

2.2.1    settings.properties

Файл settings.properties — это обычный файл свойств, загружаемый файлами Spring IOC. Вот содержимое файла свойств:

mail.host=smtp.bluejoe.cn
mail.port=25
mail.username=sdb-support@cnic.cn
mail.password=sdbsupport
mail.from=sdb-support@cnic.cn
model.dir=../models
alarm.mail.template=classpath:/alarm-template.txt
hibernate.dialect=org.hibernate.dialect.MySQLDialect
hibernate.hbm2ddl.auto=none
activitidb.url=jdbc:h2:mem:activiti;DB_CLOSE_DELAY=1000
activitidb.driver=org.hDriver
activitidb.username=sa
activitidb.password=
owfdb.url=jdbc:mysql://localhost:3306/openwebflow?useUnicode=true&characterEncoding=UTF-8
owfdb.driver=com.mysql.jdbc.Driver
owfdb.username=root
owfdb.password=1

Значение каждого атрибута следующее:

Имя свойства

пример значения

значение

mail.host

smtp.bluejoe.cn

Адрес сервера исходящей почты

mail.port

25

Номер порта сервера исходящей почты

mail.username

sdb-support@cnic.cn

Имя учетной записи для отправки напоминаний по электронной почте

mail.password

sdbsupport

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

mail.from

sdb-support@cnic.cn

отправитель электронной почты с напоминанием

model.dir

../models

Путь к автозагружаемой модели BPMN

alarm.mail.template

classpath:/alarm-template.txt

Шаблон письма с напоминанием

hibernate.dialect

org.hibernate.dialect.MySQLDialect

Гибернатный диалект

hibernate.hbm2ddl.auto

none

Настройки гибернации DDL

activitidb.url

jdbc:h2:mem:activiti;DB_CLOSE_DELAY

URL-адрес JDBC базы данных Activiti

activitidb.driver

org.h2.Driver

JDBC-драйвер базы данных Activiti

activitidb.username

sa

Имя учетной записи базы данных Activiti

activitidb.password

 

Пароль учетной записи базы данных Activiti

owfdb.url

jdbc:mysql://localhost:3306/openwebflow?useUnicode

URL JDBC базы данных OpenWebFlow

owfdb.driver

com.mysql.jdbc.Driver

JDBC-драйвер базы данных OpenWebFlow

owfdb.username

root

Имя учетной записи базы данных OpenWebFlow

owfdb.password

1

Пароль учетной записи базы данных OpenWebFlow

2.2.2 Конфигурация activiti.cfg.core.xml

Конфигурация файла activiti.cfg.core.xml чем-то похожа на файл конфигурации, требуемый Activiti, но может иметь больше содержимого.Вот пример:

<!-- 工作流核心数据库配置 -->
<bean id="activitiDataSource" class="org.apache.commons.dbcp.BasicDataSource"
	destroy-method="close">
	<property name="driverClassName" value="${activitidb.driver}" />
	<property name="url" value="${activitidb.url}" />
	<property name="username" value="${activitidb.username}" />
	<property name="password" value="${activitidb.password}" />
	<property name="initialSize" value="20" />
	<property name="maxActive" value="50" />
	<property name="maxIdle" value="20" />
	<property name="minIdle" value="10" />
</bean>

<!-- 任务催办配置 -->
<bean id="myTaskAlarmService" class="org.openwebflow.alarm.impl.TaskAlarmServiceImpl">
	<!-- 截止日期提前量 -->
	<property name="periodInAdvance" value="P2D" />
	<!-- 设置消息通知机制 -->
	<property name="messageNotifier">
		<!-- 采用邮件发送 -->
		<bean class="org.openwebflow.alarm.impl.MailMessageNotifier">
			<property name="subjectTemplate" value="请尽快处理#{'$'}{task.name}任务" />
			<property name="messageTemplateResource" value="${alarm.mail.template}" />
			<property name="mailSender">
				<bean class="org.openwebflow.alarm.impl.MailSender">
					<property name="serverHost" value="${mail.host}" />
					<property name="serverPort" value="${mail.port}" />
					<property name="authUserName" value="${mail.username}" />
					<property name="authPassword" value="${mail.password}" />
					<property name="mailFrom" value="${mail.from}" />
				</bean>
			</property>
		</bean>
	</property>
	<property name="membershipManager" ref="myMembershipManager" />
	<property name="userDetailsManager" ref="myUserDetailsManager" />
	<property name="taskNotificationManager" ref="myTaskNotificationManager" />
</bean>

<bean id="transactionManager"
	class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
	<property name="dataSource" ref="activitiDataSource" />
</bean>

<tx:annotation-driven transaction-manager="transactionManager" />

<!-- 配置对象 -->
<bean id="processEngineConfiguration" class="org.openwebflow.cfg.ProcessEngineConfigurationEx">
	<property name="dataSource" ref="activitiDataSource" />
	<property name="transactionManager" ref="transactionManager" />
	<property name="databaseSchemaUpdate" value="true" />
	<property name="jobExecutorActivate" value="false" />
	<property name="startEngineEventListeners">
		<list>
			<!-- 加载自定义表单元素类型 -->
			<bean class="org.openwebflow.cfg.LoadDummyFormTypes">
				<property name="typeNames" value="user" />
			</bean>
			<!-- 自定义成员关系管理 -->
			<bean class="org.openwebflow.cfg.ReplaceMembershipManager">
				<property name="customMembershipManager" ref="myMembershipManager" />
			</bean>
			<!-- 自定义活动权限管理 -->
			<bean class="org.openwebflow.cfg.ReplaceTaskAssignmentHandler">
				<!-- 授权处理器列表,会组成一个链,越靠后优先级越高(越靠外) -->
				<property name="handlers">
					<list>
						<!-- 自定义授权项列表 -->
						<bean
							class="org.openwebflow.assign.permission.ActivityPermissionAssignmentHandler">
							<property name="activityPermissionManager" ref="myActivityPermissionManager" />
						</bean>
						<!-- 允许授权代理 -->
						<bean
							class="org.openwebflow.assign.delegation.TaskDelagationAssignmentHandler">
							<property name="delegationManager" ref="myDelegationManager" />
							<property name="membershipManager" ref="myMembershipManager" />
							<property name="hideDelegated" value="false" />
						</bean>
					</list>
				</property>
			</bean>
			<!-- 自动导入流程模型 -->
			<bean class="org.openwebflow.cfg.ImportDefinedProcessModels">
				<property name="modelDir" value="${model.dir}" />
			</bean>
			<!-- 启动催办管理器 -->
			<bean class="org.openwebflow.cfg.StartTaskAlarmService">
				<property name="taskAlarmService" ref="myTaskAlarmService" />
				<property name="runOnStartup" value="false" />
			</bean>
			<!-- 加载自定义activity -->
			<bean class="org.openwebflow.cfg.LoadRuntimeActivityDefinitions">
				<property name="activityDefinitionManager" ref="myActivityDefinitionManager" />
			</bean>
		</list>
	</property>
</bean>

<!-- processEngine -->
<bean id="processEngine" class="org.activiti.spring.ProcessEngineFactoryBean">
	<property name="processEngineConfiguration" ref="processEngineConfiguration" />
</bean>

<!-- 工作流流转服务对象工厂 -->
<bean class="org.openwebflow.ctrl.impl.DefaultTaskFlowControlServiceFactory" />

<!-- processEngineTool -->
<bean id="processEngineTool" class="org.openwebflow.util.ProcessEngineTool" />

Где processEngineConfiguration — это расширенный объект конфигурации механизма рабочего процесса, который можно установитьНастроить политику управления членами группы пользователей,Настройка политик управления правами на действияЖдать.

Полный пример см. на странице https://gitee.com/bluejoe/openwebflow/blob/master/openwebflow-test/src/test/resources/activiti.cfg.core.xml.

2.2.3 Конфигурация activiti.cfg.mem.xml

Некоторые менеджеры используются в activiti.core.xml. activiti.mem.xml определяет реализацию диспетчера на основе памяти. Содержимое activiti.mem.xml по умолчанию выглядит следующим образом:

<!-- 自定义成员关系管理 -->
<bean id="myMembershipManager" class="org.openwebflow.mgr.mem.InMemoryMembershipManager" />
<bean id="myUserDetailsManager" class="org.openwebflow.mgr.mem.InMemoryUserDetailsManager" />

<!-- 自定义的活动权限表管理 -->
<bean id="myActivityPermissionManager"
	class="org.openwebflow.mgr.mem.InMemoryActivityPermissionManager" />
	
<!-- 代理关系管理 -->
<bean id="myDelegationManager" class="org.openwebflow.mgr.mem.InMemoryDelegationManager" />
	
<!-- 自定义的动态自定义活动管理 -->
<bean id="myActivityDefinitionManager"
	class="org.openwebflow.mgr.mem.InMemoryRuntimeActivityDefinitionManager" />

<bean id="myTaskNotificationManager" class="org.openwebflow.mgr.mem.InMemoryTaskNotificationManager" />

Здесь определены 6 менеджеров:

Менеджер категории

значение

myMembershipManager

自定义成员关系管理

myUserDetailsManager

自定义用户详细信息管理

myActivityPermissionManager

自定义的活动权限表管理

myDelegationManager

代理关系管理

myActivityDefinitionManager

自定义的动态自定义活动管理

myTaskNotificationManager

任务通知信息管理

Полный пример см. на странице https://gitee.com/bluejoe/openwebflow/blob/master/openwebflow-test/src/test/resources/activiti.cfg.mem.xml.

Альтернативными файлами, подобными activiti.cfg.core.xml, являются activiti.cfg.sql.hibernate.xml и activiti.cfg.sql.mybatis.xml.

2.2.4 Конфигурация activiti.cfg.sql.hibernate.xml

activiti.sql.hibernate.xml обеспечивает реализацию менеджера на основе SQL, а используемой инфраструктурой ORM является Hibernate 4.

Определение каждого менеджера выглядит следующим образом:

<!-- 代理记录管理 -->
<bean id="myDelegationManager"
	class="org.openwebflow.mgr.hibernate.service.SqlDelegationManager" />
<!-- 自定义成员关系管理 -->
<bean id="myMembershipManager"
	class="org.openwebflow.mgr.hibernate.service.SqlMembershipManager" />
<!-- 自定义用户表 -->
<bean id="myUserDetailsManager"
	class="org.openwebflow.mgr.hibernate.service.SqlUserDetailsManager" />
<!-- 自定义的活动权限表管理 -->
<bean id="myActivityPermissionManager"
	class="org.openwebflow.mgr.hibernate.service.SqlActivityPermissionManager" />
<!-- 自定义的动态自定义活动管理 -->
<bean id="myActivityDefinitionManager"
	class="org.openwebflow.mgr.hibernate.service.SqlRuntimeActivityDefinitionManager" />
<bean id="myTaskNotificationManager"
	class="org.openwebflow.mgr.hibernate.service.SqlTaskNotificationManager" />

Кроме того, необходимо определить источники данных, фабрики Hibernate Session и транзакции.

<!-- 数据库脚本见openwebflow.sql -->
<bean id="owfDataSource" class="org.apache.commons.dbcp.BasicDataSource"
	destroy-method="close">
	<property name="driverClassName" value="${owfdb.driver}" />
	<property name="url" value="${owfdb.url}" />
	<property name="username" value="${owfdb.username}" />
	<property name="password" value="${owfdb.password}" />
	<property name="initialSize" value="20" />
	<property name="maxActive" value="50" />
	<property name="maxIdle" value="20" />
	<property name="minIdle" value="10" />
</bean>

<!-- 配置SessionFactory -->
<bean id="sessionFactory"
	class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
	<property name="dataSource" ref="owfDataSource" />
	<property name="hibernateProperties">
		<props>
			<prop key="hibernate.dialect">${hibernate.dialect}</prop>
			<!-- <prop key="hibernate.dialect">org.hibernate.dialect.SQLServer2008Dialect</prop> -->
			<!-- 服务启动通过实体创建数据库表信息 -->
			<prop key="hibernate.hbm2ddl.auto">${hibernate.hbm2ddl.auto}</prop>
			<prop key="hibernate.show_sql">true</prop>
			<prop key="hibernate.format_sql">true</prop>
			<prop key="hibernate.jdbc.batch_size">20</prop>
			<prop key="hibernate.connection.release_mode">auto</prop>
			<prop key="hibernate.autoReconnect">false</prop>
			<prop key="hibernate.connection.autocommit">true</prop>
			<prop key="hibernate.temp.use_jdbc_metadata_defaults">false</prop>
			<prop key="hibernate.jdbc.use_streams_for_binary">true</prop>
			<prop key="hibernate.current_session_context_class">org.springframework.orm.hibernate4.SpringSessionContext
			</prop>
			<!--解决weblogic无法使用hql的问题 -->
			<prop key="hibernate.cglib.use_reflection_optimizer">true</prop>
		</props>
	</property>

	<!-- 自动扫描备注解的实体 -->
	<property name="packagesToScan">
		<list>
			<value>org.openwebflow.mgr.hibernate.entity</value>
		</list>
	</property>
</bean>

<!-- 配置一个事务管理器 -->
<bean id="transactionManager"
	class="org.springframework.orm.hibernate4.HibernateTransactionManager">
	<property name="sessionFactory" ref="sessionFactory" />
</bean>

<tx:annotation-driven transaction-manager="transactionManager" />

Используя HibernateORM, структура кода openwebflow-mgr-hibernate выглядит следующим образом:

Среди них класс DAO, класс сущности и класс обслуживания хранятся в пакетах dao, entity и service соответственно. Объявление транзакции класса обслуживания и отображение сущности аннотируются.

Полный пример см. на странице https://gitee.com/bluejoe/openwebflow/blob/master/openwebflow-test/src/test/resources/activiti.cfg.sql.hibernate.xml.

2.2.5 Конфигурация activiti.cfg.sql.mybatis.xml

activiti.sql.mybatis.xml обеспечивает реализацию менеджера на основе SQL, а используемой инфраструктурой ORM является mybatis 3.

Определение каждого менеджера выглядит следующим образом:

<!-- 代理记录管理 -->
<bean id="myDelegationManager"
	class="org.openwebflow.mgr.mybatis.service.SqlDelegationManager" />
<!-- 自定义成员关系管理 -->
<bean id="myMembershipManager"
	class="org.openwebflow.mgr.mybatis.service.SqlMembershipManager" />
<!-- 自定义用户表 -->
<bean id="myUserDetailsManager"
	class="org.openwebflow.mgr.mybatis.service.SqlUserDetailsManager" />
<!-- 自定义的活动权限表管理 -->
<bean id="myActivityPermissionManager"
	class="org.openwebflow.mgr.mybatis.service.SqlActivityPermissionManager" />
<!-- 自定义的动态自定义活动管理 -->
<bean id="myActivityDefinitionManager"
	class="org.openwebflow.mgr.mybatis.service.SqlRuntimeActivityDefinitionManager" />
<bean id="myTaskNotificationManager"
	class="org.openwebflow.mgr.mybatis.service.SqlTaskNotificationManager" />

Кроме того, необходимо определить источник данных, SqlSessionFactory и транзакцию.

<!-- 数据库脚本见openwebflow.sql -->
<bean id="owfDataSource" class="org.apache.commons.dbcp.BasicDataSource"
	destroy-method="close">
	<property name="driverClassName" value="${owfdb.driver}" />
	<property name="url" value="${owfdb.url}" />
	<property name="username" value="${owfdb.username}" />
	<property name="password" value="${owfdb.password}" />
	<property name="initialSize" value="20" />
	<property name="maxActive" value="50" />
	<property name="maxIdle" value="20" />
	<property name="minIdle" value="10" />
</bean>

<!-- 创建SqlSessionFactory,同时指定数据源-->
<bean id="owlSqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
	<property name="dataSource" ref="owfDataSource" />
</bean>

<!-- 配置一个事务管理器 -->
<bean id="transactionManager"
	class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
	<property name="dataSource" ref="owfDataSource" />
</bean>

<tx:annotation-driven transaction-manager="transactionManager" />

Используя Mybatis ORM, структура кода openwebflow-mgr-mybatis выглядит следующим образом:

При этом класс сущности интерфейса Mapper, класс службы хранятся в карте, сущности, пакете службы ниже. Класс обслуживания транзакций и делать заметки Картографирование на всем пути.

Полный пример см. на странице https://gitee.com/bluejoe/openwebflow/blob/master/openwebflow-test/src/test/resources/activiti.cfg.sql.mybatis.xml.

2.3 Дизайн базы данных

Во-первых, сам движок Activiti должен использовать ряд таблиц данных.После установки источника данных Activiti автоматически сгенерирует эти таблицы.

Все таблицы Activiti начинаются с ACT_, а вторая часть представляет собой двухбуквенный логотип, указывающий на назначение таблицы. Использование также соответствует API сервиса.

  • ACT_RE_*: «RE» означает репозиторий. Эта таблица с префиксом содержит определения процессов и статические ресурсы процессов (изображения, правила и т. д.).
  • ACT_RU_*: «RU» означает время выполнения. Эти таблицы времени выполнения содержат экземпляры процессов, задачи, переменные, асинхронные задачи и другие текущие данные. Activiti сохраняет эти данные только во время выполнения экземпляра процесса и удаляет эти записи по завершении процесса. Это позволяет рабочей таблице оставаться небольшой и быстрой.
  • ACT_ID_*: «ID» означает личность. Эти таблицы содержат идентификационную информацию, такую ​​как пользователи, группы и т. д.
  • ACT_HI_*: «HI» означает историю. Эти таблицы содержат исторические данные, такие как исторические экземпляры процессов, переменные, задачи и многое другое.
  • ACT_GE_*: общие данные, используемые в различных сценариях.

OpenWebFlow предоставляет реализации на основе базы данных для ряда менеджеров, и требуются некоторые таблицы данных. Соответствующие сценарии построения базы данных см. в каталоге https://gitee.com/bluejoe/openwebflow/tree/master/doc:

  • openwebflow-mysql4.sql: скрипт MySQL4
  • openwebflow-mysql5.sql: скрипт MySQL5
  • openwebflow-sqlserver2008.sql: скрипт SQLServer2008
  • openwebflow-oracle10g.sql: сценарий Oracle

Всего определено 6 таблиц:

  • OWF_ACTIVITY_CREATION: используется для хранения информации об определении пользовательской активности.
  • OWF_ACTIVITY_PERMISSION: используется для хранения информации о разрешениях для настраиваемых действий.
  • OWF_DELEGATION: используется для хранения информации об агенте пользователя.
  • OWF_NOTIFICATION: используется для хранения записей напоминаний.
  • OWF_MEMBERSHIP: используется для хранения членства в группе пользователей.
  • OWF_USER: используется для хранения информации о пользователе.

Примечание: OWF_MEMBERSHIP и OWF_USER используются только для тестирования.Рекомендуется, чтобы пользователи использовали свои собственные таблицы данных (одним из направлений собственных усилий OpenWebFlow является отделение управления пользователями и членством от механизма рабочего процесса) и обертывали свой собственный менеджер.

2.4 Использование bean-компонентов, определенных ApplicationContext

После использования среды Spring IoC для загрузки файла конфигурации XML ApplicationContext будет содержать следующие переменные, которые могут использоваться клиентскими программами:

  • processEngine: объект механизма рабочего процесса, стандартный объект Activiti.
  • processEngineTool: предоставляет некоторые инструментальные методы для processEngine.
  • defaultTaskFlowControlServiceFactory: фабричный объект контроллера потока задач.
  • репозиторийService: Предоставляет операции для управления и контроля пакетов выпусков и определений процессов.
  • RuntimeService: отвечает за запуск нового экземпляра определения процесса.
  • TaskService: операции, связанные с задачами
  • IdentityService: управление (создание, обновление, удаление, запрос...) группами и пользователями.
  • FormService: предоставляет две концепции формы запуска и формы задачи.
  • HistoryService: предоставляет все исторические данные телефона с двигателем Activiti.
  • ManagementService: может запрашивать таблицы базы данных и метаданные таблиц.

Ниже приведен пример кода с использованием OpenWebFlow, который точно такой же, как и с использованием Activiti:


ApplicationContext ctx = new ClassPathXmlApplicationContext("classpath:activiti.cfg.mem.xml");  
ProcessEngineTool tool = ctx.getBean(ProcessEngineTool.class);  
ProcessEngine processEngine = tool.getProcessEngine();  
// 启动流程实例  
ProcessInstance instance = processEngine.getRuntimeService().startProcessInstanceByKey("test1");  
TaskService taskService = processEngine.getTaskService();  
//会自动跳转到第一个task  
//management可以访问该task  
Assert.assertEquals(1, taskService.createTaskQuery().taskCandidateGroup("management").count());  

 

2.5 Запустите тестовый пример

В исходном коде проекта openwebflow-test пользователи могут найти набор тестовых случаев для проверки функций механизма рабочего процесса, а именно:

  • MemProcessEngineTest: тест менеджера на основе памяти
  • SqlHibernateProcessEngineTest: тест менеджера на основе hibernateORM
  • SqlMybatisProcessEngineTest: тест менеджера на основе mybatisORM

Все три вышеперечисленных тестовых класса наследуются от AbstractProcessEngineTest:

AbstractProcessEngineTest предоставляет методы тестирования:

方法摘要

void

testActivityPermission() 
          
测试流程动态授权

 void

testAlarm() 
          
测试催办功能

 void

testCachedDefinitions() 
          
测试TaskDefinition

 void

testDelegation() 
          
测试代理功能

 void

testInsertTasksAfter() 
          
测试后加签

 void

testInsertTasksBefore() 
          
测试前加签

 void

testInsertTasksWithPersistence() 
          
测试加签功能的持久化

 void

testModelDeployment() 
          
测试流程模型部署

 void

testMove() 
          
测试自由跳转

 void

testMultiInstancesLoop() 
          
测试多实例节点

 void

testSplit() 
          
测试测试节点分裂

Для взаимодействия с тестом разработан сложный процесс (models/test2.bpmn), как показано на рисунке:

 

Выберите указанный тестовый модуль (например: MemProcessEngineTest) и запустите его как «тест JUnit» (Run As...), и вы сможете наблюдать за результатами теста:

 

При желании запустите набор тестов AllTests:

 

3. Знаком с кодом OpenWebFlow

3.1 Загрузите исходный код

Пользователи могут загрузить zip-пакет OpenWebFlow по адресу: https://gitee.com/bluejoe/openwebflow/archive/master.zip.

Вы также можете получить последний исходный код через git, адрес репозитория git: https://gitee.com/bluejoe/openwebflow.git.

3.2 Структура кода

Исходный код OpenWebFlow содержит 5 проектов maven, из которых проект openwebflow является родительским проектом, в котором объявлены 4 модели, включая openwebflow-core, openwebflow-mgr-hibernate, openwebflow-mgr-mybatis и openwebflow-test.

  • openwebflow-core: основной проект, включая все основное содержимое механизма расширения OpenWebFlow, а также реализацию диспетчера на основе памяти.
  • openwebflow-mgr-hibernate: зависит от ядра openwebflow, обеспечивает реализацию менеджера на основе базы данных, структура ORM использует Hibernate.
  • OpenWLEBFLOW-MGR-MYBATIS: зависит от сердечника OpenWflow-Core, обеспечивает реализацию менеджера на основе базы данных, а каркас ORM использует MyBatis.
  • OpenWflow-Test: зависит от вышеуказанных проектов, предоставляет тестовые случаи, включая файлы конфигурации, классы испытаний и т. Д.

3.3 построить проект

Полученный исходный код проекта можно собрать и установить с помощью Maven, скриншот сборки:

 

3.4 Основные объекты

3.4.1    ProcessEngineConfigurationEx

ProcessEngineConfigurationEx — производный класс для класса ProcessEngineConfiguration, предоставляемого Activiti:

 

Большинство параметров у них одинаковые, единственное отличие состоит в том, что ProcessEngineConfigurationEx предоставляет атрибут: startEngineEventListeners.

startEngineEventListeners используется для определения других задач, которые необходимо запускать одновременно с запуском механизма рабочего процесса. , ReplaceTaskAssignmentHandler, ImportDefinedProcessModels, StartTaskAlarmService, LoadRuntimeActivityDefinitions. Список задач и атрибутов класса выглядит следующим образом:

класс задач

использовать

Имя свойства

значение атрибута

LoadDummyFormTypes

Загрузите некоторые бесполезные типы форм, чтобы заблокировать ошибки, вызванные некоторыми пользовательскими формами.

typeNames

Форма необходима имен типа щита, разделенные; такие как: пользователь

ReplaceMembershipManager

Возьми через членство группы пользователей напрямую

customMembershipManager

Указывает настраиваемый клиентом менеджер

ReplaceTaskAssignmentHandler

Возьмите на себя управление правами пользователей Activiti, если вы хотите добиться динамического назначения прав узла, вы должны включить его.

handlers

Определите список авторизованных процессоров, тип значения — Список, каждый список авторизованных процессоров будет формировать цепочку во время выполнения, и чем выше приоритет (тем дальше)

ImportDefinedProcessModels

Автоматически импортировать модели BPMN из указанного каталога

modelDir

Путь, используемый для указания модели, который может быть classpath: и т.д.

StartTaskAlarmService

Начните задачу для продвижения службы

taskAlarmService

Установить клиентов напоминания

 

 

runOnStartup

Начинать ли сначала (по умолчанию true)

LoadRuntimeActivityDefinitions

Загружать определение узла во время выполнения, в основном используется для поддержки определения новых узлов во время выполнения.

activityDefinitionManager

Задает менеджер определения узла

3.4.2    ProcessEngineTool

ProcessEngineTool предоставляет некоторые инструментальные методы, функции которых, как правило, сложно получить напрямую через ProcessEngine:

Краткое описание метода

 org.activiti.engine.repository.Model

createNewModel(java.lang.String name, java.lang.String description) 
          
创建一个空白的Model对象

 org.activiti.engine.repository.Deployment

deployModel(java.lang.String modelId) 
          
部署一个已注册的model

 org.activiti.engine.impl.pvm.process.ActivityImpl

getActivity(java.lang.String processDefId, java.lang.String activityId) 
          
获取指定名字的活动

 java.util.Map<java.lang.String,java.lang.Object>

getHistoricProcessVariables(java.lang.String processId) 
          
获取指定历史流程的变量列表

 org.activiti.engine.impl.persistence.entity.ProcessDefinitionEntity

getProcessDefinition(java.lang.String processDefId) 
          
获取指定ID的流程定义

 org.activiti.engine.ProcessEngine

getProcessEngine() 
           

 void

grantPermission(org.activiti.engine.impl.pvm.process.ActivityImpl activity, java.lang.String assigneeExpression, java.lang.String candidateGroupIdExpressions, java.lang.String candidateUserIdExpressions) 
          
设置指定活动的用户权限,包括钦定用户、候选用户、候选组

 void

grantPermission(java.lang.String processDefId, java.lang.String activityId, java.lang.String assigneeExpression, java.lang.String candidateGroupIdExpressions, java.lang.String candidateUserIdExpressions) 
          
设置指定活动的用户权限,包括钦定用户、候选用户、候选组

 void

setProcessEngine(org.activiti.engine.ProcessEngine processEngine) 

3.4.3 Различные Utils

OpenWebFlow предоставляет некоторые общие классы инструментов, а именно:

резюме класса

CloneUtils

实现对象的克隆功能

ExpressionUtils

实现常见类型的expression的包装和转换

IdentityUtils

实现用户、成员关系等相关操作

ModelUtils

包装了对BPMN模型的部署、注册等功能

ProcessDefinitionUtils

流程定义相关操作的封装

3.4.4    TaskFlowControlService

TaskFlowControlService используется для реализации свободного управления процессом и предоставляет следующие методы:

Краткое описание метода

 org.activiti.engine.impl.pvm.process.ActivityImpl[]

insertTasksAfter(java.lang.String targetTaskDefinitionKey, java.lang.String... assignees) 
          
后加签

 org.activiti.engine.impl.pvm.process.ActivityImpl[]

insertTasksBefore(java.lang.String targetTaskDefinitionKey, java.lang.String... assignees) 
          
前加签

 void

moveBack() 
          
后退一步

 void

moveBack(org.activiti.engine.impl.persistence.entity.TaskEntity currentTaskEntity) 
          
后退至指定活动

 void

moveForward() 
          
前进一步

 void

moveForward(org.activiti.engine.impl.persistence.entity.TaskEntity currentTaskEntity) 
          
前进至指定活动

 void

moveTo(java.lang.String targetTaskDefinitionKey) 
          
跳转(包括回退和向前)至指定活动节点

 void

moveTo(java.lang.String currentTaskId, java.lang.String targetTaskDefinitionKey) 
          
跳转(包括回退和向前)至指定活动节点

 void

moveTo(org.activiti.engine.impl.persistence.entity.TaskEntity currentTaskEntity, java.lang.String targetTaskDefinitionKey) 
          
跳转(包括回退和向前)至指定活动节点

 org.activiti.engine.impl.pvm.process.ActivityImpl

split(java.lang.String targetTaskDefinitionKey, boolean isSequential, java.lang.String... assignees) 
          
分裂某节点为多实例节点

 org.activiti.engine.impl.pvm.process.ActivityImpl

split(java.lang.String targetTaskDefinitionKey, java.lang.String... assignee) 
          
分裂某节点为多实例节点

Для создания TaskFlowControlService требуется TaskFlowControlServiceFactory, а объект factory можно получить из контекста приложения.

4. Дизайн и использование основных функций [опущено]

5. Менеджер интерфейса с использованием пользовательских расширений

OpenWebflow требует, чтобы пользователи предоставили интерфейс менеджеров 6 классов, а именно:

  • RuntimeActivityDefinitionManager: отвечает за получение информации об определении действий для поддержки новых действий во время выполнения.
  • ActivityPermissionManager: отвечает за получение информации о настройках разрешений действия.
  • TaskNotificationManager: отвечает за доступ к информации о напоминаниях о задачах.
  • DelegationManager: отвечает за получение информации о прокси-сервере пользователя.
  • UserDetailsManager: отвечает за получение информации о пользователе (включая адрес электронной почты, псевдоним, номер мобильного телефона и т. д.), в основном используется для отправки напоминаний.
  • IdentityMembershipManager: когда отвечает за получение членства группы пользователей, доступ к кандидату задачи пользователей, вам нужно добраться до группы пользователей по имени пользователя

В дополнение к этим менеджерам пользователи обнаружит, что OpenWLEBFLOW также предоставляет серию интерфейсов MageRex:

  • ActivityPermissionManagerEx: отвечает за сохранение информации о настройках разрешений действия.
  • TaskNotificationManagerEx: отвечает за сохранение информации уведомления о напоминании о задаче.
  • DelegationManagerEx: отвечает за сохранение информации о прокси-сервере пользователя.
  • UserDetailsManagerEx: отвечает за сохранение информации о пользователе.
  • IdentityMembershipManagerEx: отвечает за сохранение членства в группе пользователей.

Вы можете просто подумать, что интерфейс менеджера в основном используется для чтения информации (чтений), интерфейс ManageEx в основном используется для записи информации для (запись), обратите внимание при использовании двигателя OpenWflow, ManageEx не должен предоставлять соответствующую реализацию! Использовать все операции OpenWebflow Engine будет звонить только в менеджер, а не менеджер, состоит в том, чтобы предоставить менеджер-тестирование (если не написано, READ RETENT всегда пусто, тест не может быть нормальным).

5.1 Управление определением деятельности

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

5.1.1    RuntimeActivityDefinitionManager

RuntimeActivityDefinitionManager содержит следующие методы:

方法摘要

java.util.List <RuntimeActivityDefinitionEntity>

list() 
Получите всю информацию об определениях действий, механизм загрузит эти определения действий и зарегистрирует их при запуске.

 void

removeAll() 
Удалить все определения действий

 void

save(RuntimeActivityDefinitionEntity entity) 
Добавьте сообщение с определением действия

5.1.2    RuntimeActivityDefinitionEntity

RuntimeActivityDefinitionEntity соответствует информации об определении действия:

 

方法摘要

 void

deserializeProperties() 
          
反序列化PropertiesText到Map

 java.lang.String

getFactoryName() 
          
获取工厂名

 java.lang.String

getProcessDefinitionId() 
          
获取流程定义的ID

 java.lang.String

getProcessInstanceId() 
          
获取流程实例的ID

 java.lang.String

getPropertiesText() 
          
获取PropertiesText,它是一个JSON字符串

<T> T

getProperty(java.lang.String name) 
          
获取指定的属性值

 void

serializeProperties() 
          
序列化Map至PropertiesText

 void

setFactoryName(java.lang.String factoryName) 
          
设置工厂名

 void

setProcessDefinitionId(java.lang.String processDefinitionId) 
          
设置流程定义ID

 void

setProcessInstanceId(java.lang.String processInstanceId) 
          
设置流程实例ID

 void

setPropertiesText(java.lang.String propertiesText) 
          
设置PropertiesText

<T> void

setProperty(java.lang.String name, T value) 

5.2 Управление правами на деятельность

5.2.1    ActivityPermissionManager

Интерфейс управления разрешениями действий — ActivityPermissionManager, который определяется следующим образом:

方法摘要

 ActivityPermissionEntity

load(java.lang.String processDefinitionId, java.lang.String taskDefinitionKey, boolean addOrRemove) 
          
获取指定活动的权限定义信息

5.2.2    ActivityPermissionEntity

Очень просто, ему просто нужен метод, который возвращает ActivityPermissionEntity, который определяется следующим образом:

方法摘要

 java.lang.String

getAssignee() 
          
获取直接授权人

 java.lang.String[]

getGrantedGroupIds() 
          
获取候选组列表

 java.lang.String[]

getGrantedUserIds() 
          
获取候选用户列表

5.2.3    ActivityPermissionManagerEx

ActivityPermissionManagerEx реализует операцию «записи» в таблицу разрешений активности:

方法摘要

void

removeAll() 
          
删除所有权限定义信息

 void

save(java.lang.String processDefId, java.lang.String taskDefinitionKey, java.lang.String assignee, java.lang.String[] candidateGroupIds, java.lang.String[] candidateUserIds) 
          
保存一条权限定义信息

5.3 Управление уведомлениями о задачах

5.3.1    TaskNotificationManager

TaskNotificationManager отвечает за чтение и настройку статуса напоминаний о задачах, интерфейс тоже очень простой:

方法摘要

 boolean

isNotified(java.lang.String taskId) 
          
判断指定任务是否通知过

 void

setNotified(java.lang.String taskId) 
          
设置指定任务的通知状态

Следует понимать, что TaskNotificationManager поддерживает запись в очереди о состоянии каждого уведомления о задаче (уведомление истинно, не уведомлено как ложное).

5.3.2    TaskNotificationManagerEx

TaskNotificationManagerEx реализует операции «записи» в записи уведомлений:

方法摘要

 void

removeAll() 
          
删除所有通知记录

5.4 Управление взаимоотношениями между пользователем и агентом

5.4.1    DelegationManager

DelegationManager используется для поддержания прокси-отношений между пользователями. Интерфейс содержит 2 метода:

方法摘要

 java.lang.String[]

getDelegates(java.lang.String delegated) 
          
获取指定用户的代理人列表

 java.util.List<DelegationEntity>

listDelegationEntities() 
          
获取所有的代理信息列表,引擎会在启动的时候加载

5.4.2    DelegationEntity

DelegationEntity描述一条代理关系:

方法摘要

 java.lang.String

getDelegate() 
          
获取当前代理记录的代理人

 java.lang.String

getDelegated() 
          
获取当前代理记录的被代理人

5.4.3    DelegationManagerEx

DelegationManagerEx используется для реализации операций «записи» над записями делегатов:

方法摘要

 void

removeAll() 
          
删除所有代理信息

 void

saveDelegation(java.lang.String delegated, java.lang.String delegate) 
          
保存一条代理信息

5.5 Управление данными пользователей

5.5.1    UserDetailsManager

UserDetailsManager отвечает за получение информации о пользователе (включая адрес электронной почты, псевдоним, номер мобильного телефона и т. д.) и в основном используется для отправки уведомлений-напоминаний. Интерфейс UserDetailsManager содержит следующие методы:

方法摘要

 UserDetailsEntity

findUserDetails(java.lang.String userId) 
          
根据用户名获取用户详细信息

5.5.2    UserDetailsEntity

UserDetailsEntity用以描述用户详细信息,注意它没有强制要求提供诸如getName()这样的方法,而是提供了一个getProperty(Stringname)方法:

方法摘要

<T> T

getProperty(java.lang.String name) 
          
获取指定属性的值

 java.lang.String[]

getPropertyNames() 
          
获取所有的属性名

 java.lang.String

getUserId() 
          
获取用户的ID

<T> void

setProperty(java.lang.String name, T value) 
          
设置指定属性的值

UserDetailsEntity同时提供了几个字符串常量:

字段摘要

static java.lang.String

STRING_PROPERTY_EMAIL 
          EMAIL
属性名

static java.lang.String

STRING_PROPERTY_MOBILE_PHONE_NUMBER 
          
手机号码属性名

static java.lang.String

STRING_PROPERTY_NICK_NAME 
          
昵称属性名

static java.lang.String

STRING_PROPERTY_USER_ID 
          
用户ID属性名

5.5.3    UserDetailsManagerEx

UserdetailsmanageRex используется для реализации работы пользовательской информации «Написать»:

方法摘要

 void

removeAll() 
          
删除所有用户信息

 void

saveUserDetails(UserDetailsEntity userDetails) 
          
保存某个用户的信息

 

5.6 Управление членством в группах пользователей

5.6.1    IdentityMembershipManager

IdentityMembershipManager отвечает за получение членства в группе пользователей, Проще говоря, он должен получить список идентификаторов группы, к которой принадлежит указанный пользователь, и список идентификаторов участников в указанной группе.

方法摘要

java.util.List <java.lang.String>

findGroupIdsByUser(java.lang.String userId) 
          
获取指定的用户所在的组ID列表

 java.util.List <java.lang.String>

findUserIdsByGroup(java.lang.String groupId) 
          
获取指定组的成员用户ID列表

5.6.2    IdentityMembershipManagerEx

IdentityMembershipManagerEx обеспечивает операции записи информации о членстве:

方法摘要

 void

removeAll() 
          
删除所有成员关系

 void

saveMembership(java.lang.String userId, java.lang.String groupId) 
          
保存成员关系

6. Другая помощь

Адрес загрузки этого документа: https://gitee.com/bluejoe./openwebflow/tree/master/doc, своевременный доступ к последней версии по этому адресу.

Если вам нужно проконсультироваться с OpenWebFlow API Java, обратитесь к javadoc (https://gitee.com/bluejoe/openwebflow/tree/master/openwebflow-core/doc/javadoc).

Вы также можете подписаться на Wiki (https://gitee.com/bluejoe/openwebflow/wiki), отправить задачу (https://gitee.com/bluejoe/openwebflow/issues) и связаться с автором напрямую по адресу bluejoe2008@gmail. .ком.

7. Ошибки Activiti и контрмеры

В настоящее время автор обнаружил, что во фреймворке Activiti есть 2 ошибки, в основном в:

Первая ошибка заключается в том, что когда BaseBpmnJsonConverter выводит модель BPMN в формат JSON, он игнорирует вывод истинных логических значений. Эта ошибка приведет к тому, что JsonConverterUtil.getPropertyValueAsBoolean() получит ложное значение (поскольку стандартом оценки в настоящее время становится «Да». или Нет). Адрес отчета об ошибке: https://github.com/Activiti/Activiti/pull/464#event-204722250.

Другая ошибка заключается в том, что при загрузке файла BPMN, когда локальный набор символов не является UTF-8 (например, GB2312), возникает ошибка загрузки модели. Адрес сообщения об ошибке: https://github.com/Activiti/Activiti/pull/486#event-220121880.

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