將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中提供的日歷管理頁面。