2.安装与配置
使用UFLO,要从安装UFLO流程模版设计器开始。安装方法是打开UFLO在BSDN的项目主页,进入其下载专区(http://www.bsdn.org/proje
cts/uflo/download/list),下载以uflo-ide开头的包,下载到本地后解压,将解压后的文件夹放置到Eclipse的dropins目录下重启Eclipse即可。
上述操作要求我们本地要有一个3.5及以上J2EE版本的Eclipse(如果你用的是MyEclipse,不能保证安装成功)。安装成功打Eclipse后,可以在新建文件向导中看到UFLO流程模版的创建菜单,如下图所示:
如果您看到了如上图所示的UFLO流程模版创建菜单,那就说明您的UFLO流程模版设计器安装成功了,接下来就可以选择一个模版文件存放目录,创建第一个流程模版了。
流程模版设计器安装成功之后,接下来就可以配置我们的项目了。将UFLO添加到我们的项目当中分两种情况,一种是Maven项目,另一种是普通的web项目,我们首先来看看如果将UFLO添加到我们现有的一个由Maven管理的项目当中。
首先打开打开一个已存在的dorado7项目,找到项目中的pom.xml文件,在其中添加uflo-core依赖,内容如下:
uflo-core依赖配置
<dependency>
<groupId>com.bstek.uflo</groupId>
<artifactId>uflo-core</artifactId>
<version>[version]</version> </dependency>
uflo-console模块依赖配置如下:
<dependency>
<groupId>com.bstek.uflo</groupId>
<artifactId>uflo-console</artifactId>
<version>[version]</version> </dependency>
对于uflo-core与uflo-console两模块,我们提供了基于hibernate3与hibernate4编译的两种类型的版本,如果您的项目持久层采用的是hibernate3,那么上述的默认配置下载的就是基于hibernate3编译的版本;如果您需要基于hibernate4编译的版本,那么需要添加classifier标记,如下面的dependency所示:
<dependency>
<groupId>com.bstek.uflo</groupId>
<artifactId>uflo-core</artifactId>
<version>[version]</version>
<classifier>hibernate4</classifier> </dependency>
当然如果要显示取hibernate3版本,上述在classifier中的hibernate4就要改成hibernate3。无论是哪个版本,uflo-core与uflo-console的依赖中都没有显示标记要依赖hibernate,所以我们需要在项目的pom.xml中添加对应的hibernate版本依赖信息。
最后我们还需要添加uflo-client模块,那么需要在pom.xml中添加如下配置:
uflo-client模块依赖配置
<dependency>
<groupId>com.bstek.uflo</groupId>
<artifactId>uflo-client</artifactId>
<version>[version]</version> </dependency>
因为uflo-client模块没有hibernate3或hibernate4版本之分,所以在添加uflo-client模块时,是不需要添加classifier标记的。
当然因为我们的这些包都托管在BSDN的Maven库当中,所以还需要修改您的pom.xml,在其中添加如下配置,以告诉Maven该到哪里下载这些Jar包。
Maven库配置
<repositories>
<repository> <id>bsdn-maven-repository</id> <url>http://nexus.bsdn.org/content/groups/public/</url>
</repository> </repositories>
以上为Maven项目在添加UFLO支持时所需要做的工作,如果您采用的是传统项目,那配置过程相比之下就麻烦多了,我们需要到http://www.bsdn.org/projects/uflo/download上下载UFLO发行包(不一定是最新的)及所需要的第三方依赖Jar包,然后把它们放到我们的项目当中,最后就是检查有没有同类型但版本不同的Jar,如果有还需要进行清理,最后启动测试,如果有报错,再根据报错信息进行处理......
项目添加好UFLO之后,接下来还需要编写一个名为EnvironmentProvider接口实现类,其源码如下,具体作用见接口描述:
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 返回流程引擎临时文件存储目录
*/
String getTempFileStorePath(); /**
* @return 返回流程引擎需要使用的Hibernate SessionFactory
*/
SessionFactory getSessionFactory(); /**
* @return 返回与当前SessionFactory绑定的PlatformTransactionManager对象
*/
PlatformTransactionManager getPlatformTransactionManager(); /**
* @return 返回当前系统的登录用户
*/
String getLoginUser(); /**
* @return 返回当前系统分类ID
*/
String getCategoryId();
}
下面的代码当中向我们展示了一个实现了EnvironmentProvider接口的示例。
EnvironmentProvider实现类示例
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 String getTempFileStorePath() { return System.getProperty("java.io.tmpdir"); } 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"; } }
在上面的示例实现类当中,getTempFileStorePath方法返回的临时目录我们定义为当前jvm的临时目录;SessionFactory及TransactionManager都是通过Spring环境注入;getLoginUser方法用于返回当前登录用户,因为我们这里没有用户登录的概念,所以这里返回一个固定值“anonymous”;getCategoryId方法返回null,表示不对流程进行分类处理。
该接口实现类编写完成后,需要将其配置到Spring当中,让其成为一个标准的SpringBean,这样UFLO引擎会自动检测到该类并使用它。在这个接口实现类当中,主要是其中的getSessionFactory与getPlatformTransactionManager这两个方法,第一个getSessionFactory是要返回当前指向uflo数据库的hibernate的sessionFactory对象,因为uflo是构建在spring环境之上,所以这里的sessionFactory最好是一个配置在spring环境中的sessionFactory对象,而spring恰恰也提供了创建hibernate3及hibernate4的sessionFactory对象,比如下面的spring配置是用来创建一个hibernate3的sessionFactory对象的。
<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="entityInterceptor" ref="unByteCodeProxyInterceptor" />
<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对应的dataSource绑定。
在UFLO当中提供了一些可供外部系统覆盖的属性,通过对这些属性值的重新定义,可让UFLO更加适应我们的业务系统,因为这里是在dorado7项目中添加uflo支持,所以对于uflo中提供的属性,如果我们需要在项目当中覆盖它们,那么只需要将它们定义到项目的WEB-INF/dorado-home/目录下的configure.properties文件当中即可,这些可覆盖的属性如下表所示。