将UFLO添加到我们的项目当中分两种情况,一种是Maven项目,另一种是普通的web项目,我们首先来看看如果将UFLO添加到我们现有的一个由Maven管理的项目当中。
UFLO提供了两个模块,分别是uflo-core和uflo-console。uflo-core是uflo的核心引擎模块,提供流利引擎的核心流转控制;uflo-console模块则提供了uflo的网页版流程设计器、网页版的流程控制中心等页面,因为uflo-console模块依赖于uflo-core模版,所以安装时我们只需要依赖uflo-console模块即可。
首先打开打开一个已存在的WEB项目,找到项目中的pom.xml文件,在其中添加uflo-console模块依赖,内容如下:
1
2
3
4
5
|
< dependency > < groupId >com.bstek.uflo</ groupId > < artifactId >uflo-console</ artifactId > < version >[version]</ version > </ dependency > |
默认的uflo-console是基于JDK1.8以及Hibernate5编译的,所以如果采用上述maven配置,我们需要本地安装好1.8版本的JDK。除此之外,如果我们需要Hibernate4或Hibernate3版本的uflo,那么可采用下面的依赖配置:
Hibernate4版本的uflo依赖配置:
1
2
3
4
5
|
< dependency > < groupId >com.bstek.uflo</ groupId > < artifactId >uflo-console-hibernate4</ artifactId > < version >[version]</ version > </ dependency > |
Hibernate5版本的uflo依赖配置:
1
2
3
4
5
|
< dependency > < groupId >com.bstek.uflo</ groupId > < artifactId >uflo-console-hibernate3</ artifactId > < version >[version]</ version > </ dependency > |
需要注意的是,Hibernate4与Hibernate3版本的uflo都是采用JDK1.7编译,所以需要我们预先准备好对应版本的JDK。
需要注意的是,在http://search.maven.org/上我们只能查找到最新的release版本,如果您需要最新的snapshot,那么可以到https://oss.sonatype.org/上查找,因为sonatype规定,只有正式版本才可以发到http://search.maven.org/上,也就是mave的central repository中,snapshot版本只能存在于https://oss.sonatype.org/中,所以如果我们要采用https://oss.sonatype.org/中最新的snapshot,那么就需要在pom.xml中添加一个repository信息,告诉Maven该到这里去下载snapshot版本的包,repository信息如下所示:
1
2
3
4
5
6
|
< repositories > < repository > < id >sonatype</ id > </ repository > </ repositories > |
以上为Maven项目在添加UFLO支持时所需要做的工作,如果您采用的是传统项目,那配置过程相比之下就麻烦多了,我们需要到http://search.maven.org/或https://oss.sonatype.org/上下载最新的uflo-core及uflo-console及所需要的第三方依赖Jar包,然后把它们放到我们的项目当中,最后就是检查有没有同类型但版本不同的Jar,如果有还需要进行清理,最后启动测试。
接下来还需要编写一个名为EnvironmentProvider接口实现类,其源码如下,具体作用见接口描述:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
package com.bstek.uflo.env; import org.hibernate.SessionFactory; import org.springframework.transaction.PlatformTransactionManager; /** * @author Jacky.gao * @since 2013年9月17日 */ public interface EnvironmentProvider { /** * @return 返回流程引擎需要使用的Hibernate SessionFactory */ SessionFactory getSessionFactory(); /** * @return 返回与当前SessionFactory绑定的PlatformTransactionManager对象 */ PlatformTransactionManager getPlatformTransactionManager(); /** * @return 返回当前系统的登录用户 */ String getLoginUser(); /** * @return 返回当前系统分类ID */ String getCategoryId(); } |
下面的代码当中向我们展示了一个实现了EnvironmentProvider接口的示例。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
import org.hibernate.SessionFactory; import org.springframework.transaction.PlatformTransactionManager; import com.bstek.uflo.env.EnvironmentProvider; public class TestEnvironmentProvider implements EnvironmentProvider { private SessionFactory sessionFactory; private PlatformTransactionManager platformTransactionManager; public SessionFactory getSessionFactory() { return sessionFactory; } public void setSessionFactory(SessionFactory sessionFactory) { this .sessionFactory = sessionFactory; } public PlatformTransactionManager getPlatformTransactionManager() { return platformTransactionManager; } public void setPlatformTransactionManager( PlatformTransactionManager platformTransactionManager) { this .platformTransactionManager = platformTransactionManager; } public String getCategoryId() { return null ; } public String getLoginUser() { return "anonymous" ; } } |
在上面的示例实现类当中,SessionFactory及TransactionManager都是通过Spring环境注入;getLoginUser方法用于返回当前登录用户,因为我们这里没有用户登录的概念,所以这里返回一个固定值“anonymous”;getCategoryId方法返回null,表示不对流程进行分类处理。
该接口实现类编写完成后,需要将其配置到Spring当中,让其成为一个标准的Spring Bean,这样UFLO引擎会自动检测到该类并使用它。在这个接口实现类当中,主要是其中的getSessionFactory与getPlatformTransactionManager这两个方法,第一个getSessionFactory是要返回当前指向uflo数据库的hibernate的sessionFactory对象,因为uflo是构建在spring环境之上,所以这里的sessionFactory最好是一个配置在spring环境中的sessionFactory对象,而spring恰恰也提供了创建hibernate3及hibernate4的sessionFactory对象,比如下面的spring配置是用来创建一个hibernate3的sessionFactory对象的。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
< bean id = "sessionFactory" class = "org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean" > < property name = "dataSource" ref = "dataSource" /> < property name = "packagesToScan" > < list > < value >com.bstek.uflo.model*</ value > </ list > </ property > < property name = "hibernateProperties" > < props > < prop key = "hibernate.dialect" >org.hibernate.dialect.MySQL5InnoDBDialect</ prop > < prop key = "hibernate.show_sql" >true</ prop > < prop key = "hibernate.hbm2ddl.auto" >update</ prop > </ props > </ property > </ bean > |
如果需要的是hibernate4的sessionFactory,那么我们只需要将上述配置的class值改为org.springframework.orm.hibernate4.LocalSessionFactoryBean即可。这里需要注意的是上面的packagesToScan属性,无论是哪种类型的sessionFactory,在使用uflo时都需要添加这一属性,并且需要添加一个com.bstek.uflo.model*的值,这样才能让uflo中hibernate模型对象加载到当前sessionFactory当中;还有就是uflo并没有提供流程所需要的建表schema,所以我们需要将sessionFactory配置中的hibernate.hbm2ddl.auto属性设置为update,这样hibernate会帮助我们自动创建uflo所需要的表信息。
getPlatformTransactionManager方法要求返回一个spring的PlatformTransactionManager接口实现,当然如果非JTA事务,那么PlatformTransactionManager实现必须要与当前返回的sessionFactory对应的transactionManager绑定。
打开web.xml文件,在其中添加uflo专用的servlet,配置如下:
1
2
3
4
5
6
7
8
|
< servlet > < servlet-name >ufloServlet</ servlet-name > < servlet-class >com.bstek.uflo.console.UfloServlet</ servlet-class > </ servlet > < servlet-mapping > < servlet-name >ufloServlet</ servlet-name > < url-pattern >/uflo/*</ url-pattern > </ servlet-mapping > |
最后还需要在我们的spring配置文件中导入uflo-console的spring配置文件,方法如下:
1
|
< import resource = "classpath:uflo-console-context.xml" /> |
在UFLO当中提供了一些可供外部系统覆盖的属性,通过对这些属性值的重新定义,可让UFLO更加适应我们的业务系统,如果我们项目中没有属性文件,那么可以在我们的spring配置文件中添加如下bean:
1
2
3
4
5
|
< bean id = "propertyConfigurer" parent = "uflo.props" > < property name = "location" > < value >/WEB-INF/config.properties</ value > </ property > </ bean > |
上面的“uflo.props”Bean是UFLO中提供的一个标准的org.springframework.beans.factory.config.PropertyPlaceholderConfigurer类的子类,所以该Bean采用的属性文件的加载方式就是标准的spring属性文件的加载方式。
UFLO中可覆盖的属性如下表所示。
属性名
|
类型
|
描述
|
---|---|---|
uflo.idBlockSize | 数字 | 用于定义UFLO中所有表数据主键中的缓冲区大小,缓存区越小,用完的速度就越快,这个属性默认值为10,比较便于我们开发测试,正式部署到生产环境一定要修改该属性值,修改后的值要大于1000,比如通常可设置为5000,这样缓存区足够大,就可以减小主键生成时查数据库频率,提高系统性能。 |
uflo.disableScheduler | 布尔类型 | 是否禁用当前应用中任务提醒功能,一旦禁用,则当前项目当中将不再调度运行由任务产生的各种类型的提醒的Job。 |
uflo.jobThreadCount | 数字 | 定义UFLO当中用于做任务提醒Job池大小,默认值为10,一般情况下,这个大小足够使用了,所以我们一般不改这个属性的值,除非我们的流程当中会有大量的任务,并且每个任务都有过期提醒动作,否则没有必要将该值改大。 |
uflo.makeSchedulerThreadDaemon | 布尔值 | 是否以Daemon模式开启线程池来运行job,默认值为true,建议设置成true。 |
uflo.debug | 布尔值 | 是否运行在debug模式下,默认是true(以保证设计器可以匿名访问uflo-console中提供的各种服务,比如在线部署等,如果为false则不允许匿名访问),生产环境中需要更改为false。 |
uflo.businessDayHours | 数字 | 用于在任务过期计算时设置一天的时长,一般情况下,我们对一天的计算不是24小时,而是按工作日的工作时间计算,该属性默认值为8,表示一天时长为8小时。如果你的UFLO流程模版不需要配置任务过期,那么就不用关注该值,否则就要设置成所以公司的实现工作时长。 |
uflo.minutesBeforeDueDateToRemind | 数字 | 该属性在待办任务列表中用于设置即将过期的任务的阀值,默认值1440,单位是分钟,1440分钟也就是24小时,这样所有配置了过期时间的任务,在离过期24小时以内时,待办任务列表中就会以高亮颜色进行显示。 |
uflo.disabledDeptAssigneeProvider | 布尔类型 | 是否禁用UFLO当中提供的默认的用于提供给流程模版设计器使用的基于部门的任务处理人分配方式。默认为false,表示启动。 |
uflo.disabledUserAssigneeProvider | 布尔类型 | 是否禁用UFLO当中提供的默认的用于提供给流程模版设计器使用的基于用户的任务处理人分配方式。默认为false,表示启动。 |
uflo.disableDefaultTaskDiagramInfoProvider | 布尔类型 | 是否禁用UFLO内部提供的默认的用于显示流程进度图任务节点消息提示功能,默认为false,表示启用该提示。 |
uflo.disableDefaultFileProcessProvider | 布尔类型 | 是否禁用默认流程设计器中的基于文件夹的流程模版存储器,默认启用 |
uflo.defaultFileStoreDir | 字符串 | 默认提供基于文件夹的流程模版存储器采用的文件夹URL,默认值为/WEB-INF/processfiles,所以启用应用后就会在/WEB-INF目录下看到名为processfiles目录,如果需要更改,那么可以通过修改这个属性实现,如果是绝对路径,那么需要输入完整的URL,如果需要放到/WEB-INFO目录下,那么采用上述格式定义就好。 |
启动应用,打开浏览器, 浏览http://localhost:8080/uflo-test/uflo/designer这个URL,就可以看到UFLO2中提供的全新的基于网页的流程模版设计器,如下图所示:
浏览http://localhost:8080/uflo-test/uflo/todo这个URL就可以看到UFLO中提供的默认的待办页面(实际应用中多数都需要自定义待办页面),如下图:
浏览http://localhost:8080/uflo-test/uflo/central页面就可以看到UFLO中提供的监控测试页面。
浏览http://localhost:8080/uflo-test/uflo/calendar页面就可以看到UFLO中提供的日历管理页面。