一個(gè)task-node可以包含一個(gè)或多個(gè)task,這些task分配給特定的user。當(dāng)流程執(zhí)行到task-node時(shí),task instance將會(huì)被創(chuàng)建,一個(gè)task對應(yīng)一個(gè)task instance。task instances 創(chuàng)建后,task-node就處于等待狀態(tài)。當(dāng)所有的task instances被特定的user執(zhí)行完畢后,將會(huì)發(fā)出一個(gè)新的signal 到token,即流程繼續(xù)執(zhí)行。
2、state
state是一個(gè)純粹的wait state(等待狀態(tài))。它和task-node的區(qū)別就是它不會(huì)創(chuàng)建task instances。很典型的用法是,當(dāng)進(jìn)入這個(gè)節(jié)點(diǎn)時(shí)(通過綁定一個(gè)action到node-enter event),發(fā)送一條消息到外部的系統(tǒng),然后流程就處于等待狀態(tài)。外部系統(tǒng)完成一些操作后返回一條消息,這個(gè)消息觸發(fā)一個(gè)signal 到token,然后流程繼續(xù)執(zhí)行。(不常用)
3、decision
當(dāng)需要在流程中根據(jù)不同條件來判斷執(zhí)行不同路徑時(shí),就可以用decision節(jié)點(diǎn)。兩種方法:最簡單的是在transitions里增加condition elements(條件),condition是beanshell script寫的,它返回一個(gè)boolean。當(dāng)運(yùn)行的時(shí)候,decision節(jié)點(diǎn)將會(huì)在它的 leaving transitions里循環(huán),同時(shí)比較 leaving transitions里的condition,最先返回'true'的condition,那個(gè)leaving transitions將會(huì)被執(zhí)行;作為選擇,你可以實(shí)現(xiàn)DecisionHandler接口,它有一個(gè)decide()方法,該方法返回一個(gè)String(leaving transition的名字)。
4、fork
fork節(jié)點(diǎn)把一條執(zhí)行路徑分離成多條同時(shí)進(jìn)行(并發(fā))的執(zhí)行路徑,每條離開fork節(jié)點(diǎn)的路徑產(chǎn)生一個(gè)子token。
5、join
默認(rèn)情況下,join節(jié)點(diǎn)會(huì)認(rèn)為所有到達(dá)該節(jié)點(diǎn)的token都有著相同的父token。join 節(jié)點(diǎn)會(huì)結(jié)束每一個(gè)到達(dá)該節(jié)點(diǎn)的token,當(dāng)所有的子token都到達(dá)該節(jié)點(diǎn)后,父token會(huì)激活。當(dāng)仍然有子token處于活動(dòng)狀態(tài)時(shí),join 節(jié)點(diǎn)是wait state(等待狀態(tài))。
6、node
node節(jié)點(diǎn)就是讓你掛自己的action用的(注意:不是event觸發(fā)!!),當(dāng)流程到達(dá)該節(jié)點(diǎn)時(shí),action會(huì)被執(zhí)行。你的action要實(shí)現(xiàn)ActionHandler接口。同樣,在你的action里要控制流程! 1、process definition
一個(gè)process definition代表了一個(gè)正式的業(yè)務(wù)流程,它以一個(gè)流程圖為基礎(chǔ)。這個(gè)流程圖由 許多node和transition組成。每個(gè)node在這個(gè)流程圖里都有著各自特殊的類型,這些不同的類型決定了node在運(yùn)行時(shí)的不同行為。一個(gè)process definition只有一個(gè)start state 。
2、token
一個(gè)token代表了一條執(zhí)行路徑,它包含了這條執(zhí)行路徑的當(dāng)前的執(zhí)行狀態(tài)(current state)。
3、process instance
一個(gè)process instance(流程實(shí)例)即一個(gè)process definition(流程定義)的流程執(zhí)行實(shí)例。一個(gè)process definition可以對應(yīng)多個(gè)process instance。當(dāng)一個(gè)process instance被創(chuàng)建的時(shí)候,一個(gè)主執(zhí)行路徑token同時(shí)被創(chuàng)建,這個(gè)token叫做root token,它指向流程定義的start state(processDefinition.getStartState()==token.getNode())。
4、signal
一個(gè)signal 發(fā)送給token通知token 繼續(xù)流程的執(zhí)行。如果signal 沒有指定transition,token將沿缺省的transition離開當(dāng)前狀態(tài),如果signal 指定transition,token將沿指定的transition離開當(dāng)前的狀態(tài)。看源代碼可以看到發(fā)給process instance的signal 其實(shí)都是發(fā)送給了root token。
5、Actions
jbpm提供了靈活的action ,當(dāng)流程執(zhí)行,token 進(jìn)入node和transition時(shí),會(huì)觸發(fā)相應(yīng)的一些event(事件)。在這些event上附上我們自己寫的action,就會(huì)帶動(dòng)action 的執(zhí)行。action里是我們自己的相關(guān)java操作代碼,非常方便。注意的是event(事件)是內(nèi)置的,無法擴(kuò)展。另外,action也可以直接掛在node上,而不依賴于event(事件)的觸發(fā),這個(gè)很重要!
一個(gè)Task instance(任務(wù)實(shí)例)可以被分配給一個(gè)actorId (java.lang.String)。所有的Task instance都被保存在數(shù)據(jù)庫中的表jbpm_taskinstance里。當(dāng)你想得到特定用戶的任務(wù)清單時(shí),你就可以通過一個(gè)與用戶關(guān)聯(lián)的actorId來查詢這張表。
一個(gè)流程定義有一個(gè)TaskMgmtDefinition;一個(gè)TaskMgmtDefinition對應(yīng)多個(gè)swimlane,同時(shí)對應(yīng)多個(gè)task;一個(gè)swimlane有多個(gè)task,可以 TaskMgmtDefinition中通過task的名稱直接獲取相應(yīng)的task;
swimlane對象有四個(gè)屬性,分別是name(名字)、assignmentDelegation(分配代理類)、taskMgmtDefinition、tasks(Set 對應(yīng)多個(gè)task),可以增加task
task對象主要的屬性:taskMgmtDefinition、swimlane、assignmentDelegation、taskNode,需要注意的是swimlane和assignmentDelegation中間只是可以一個(gè)屬性有值,因?yàn)樗鼈兌己腿蝿?wù)的分配有關(guān)系。
一個(gè)流程實(shí)例有一個(gè)TaskMgmtInstance;一個(gè)TaskMgmtInstance對應(yīng)多個(gè)swimlaneInstance,同時(shí)對應(yīng)多個(gè)taskInstance;一個(gè)swimlaneInstance有多個(gè)taskInstance,可以從TaskMgmtInstance中直接獲取相應(yīng)的taskInstance;
swimlaneInstance對象主要有五個(gè)屬性,分別是name、actorId、pooledActors(Set)、swimlane、taskMgmtInstance。
taskInstance對象的主要屬性:name、actorId、task、swimlaneInstance、taskMgmtInstance、pooledActors。
當(dāng)對任務(wù)進(jìn)行分配時(shí),一般需要實(shí)現(xiàn)AssignmentHandler這個(gè)接口,這個(gè)接口的方法只有一個(gè):
void assign( Assignable assignable, ExecutionContext executionContext ) throws Exception;
一個(gè)典型的實(shí)現(xiàn)(把名字是'change nappy'的任務(wù)交給NappyAssignmentHandler這個(gè)類來分配)
<task name='change nappy'>
<assignment class='org.jbpm.tutorial.taskmgmt.NappyAssignmentHandler' />
</task>
NappyAssignmentHandler類:
public void assign(Assignable assignable, ExecutionContext executionContext) {
assignable.setActorId("papa");
}
同樣,Assignable只是一個(gè)接口,它有兩個(gè)方法:setActorId()和setPooledActors(),Assignable的具體實(shí)現(xiàn)類也是兩個(gè)
swimlaneInstancehe和taskInstance。這樣就不不難理解整個(gè)任務(wù)分配流程了:
1、流程進(jìn)入TaskNode節(jié)點(diǎn),執(zhí)行TaskNode類的execute()方法,該方法首先獲得TaskMgmtInstance實(shí)例,然后通過它來創(chuàng)建TaskInstance。taskMgmtInstance.createTaskInstance(task, executionContext);
2、在上面的createTaskInstance(task, executionContext)里,該方法調(diào)用了taskInstance.assign(executionContext)對taskInstance進(jìn)行分配。
3、在assign(executionContext)方法里,首先會(huì)判斷task屬性里是否存在swimlane,如果有的話,這個(gè)taskInstance就會(huì)分配給swimlane指定的ActorId或 PooledActors;如果不存在,再去找task屬性里 assignmentDelegation(分配代理類)通過代理類(即我們自己寫的實(shí)現(xiàn)AssignmentHandler這個(gè)接口的類)指定ActorId或 PooledActors。
1. 從 http://www.jboss.com/products/jbpm/downloads 下載 jbpm-3.0.zip
2. 解壓縮 jbpm-3.0.zip 到 'temp' 目錄
3. 使用 eclipse, 將 'temp\jbpm-3.0' 作為 an existing project into workspace 導(dǎo)入
配置連接 MySQL
1. 在 'jbpm-3.0\lib' 目錄下 創(chuàng)建 'mysql' 目錄
2. 將 mysql數(shù)據(jù)庫驅(qū)動(dòng) (mysql-connector-java-3.1.7-bin.jar) 拷貝到 'mysql' 目錄
3. 在 mysql 中創(chuàng)建一個(gè)數(shù)據(jù)庫,數(shù)據(jù)庫名字
5. 把兩個(gè)配置文件 (create.db.hibernate.properties, identity.db.xml) 從 'hsqldb' 目錄下 拷貝到 'mysql' 目錄
6. 按下面所示編輯 'create.db.hibernate.properties' 文件: hibernate.dialect=org.hibernate.dialect.MySQLDialect
hibernate.connection.driver_class=com.mysql.jdbc.Driver
hibernate.connection.url=jdbc:mysql://localhost:3306/
hibernate.connection.username=
hibernate.show_sql=true hibernate.query.substitutions=true 1, false 0
hibernate.c3p0.min_size=1 hibernate.c3p0.max_size=3
7. 另一個(gè)文件 'identity.db.xml'不做改動(dòng)
8. 在 'jbpm-3.0' 根目錄, 編輯ANT的腳本 'build.deploy.xml' 找到 target name="create.db", 刪除 db.start, db.stop 在這個(gè)目標(biāo)塊中將所有的'hsqldb' 替換為 'mysql'
9. 運(yùn)行ANT ant create.db -buildfile build.deploy.xml 運(yùn)行完畢后就會(huì)發(fā)現(xiàn)mysql中多出很多表,這是jbpm保持狀態(tài)用的
創(chuàng)建 jbpm.war 使其在tomcat中運(yùn)行
默認(rèn)的打war包時(shí),掉了一些庫文件
1. 在 eclipse中, 編輯ant腳本 'build.deploy.xml' 在目標(biāo)塊 target name="build.webapp" 中在
<copy todir="build/jbpm.war.dir/WEB-INF/lib">
<fileset dir="build" includes="jbpm-webapp-${jbpm.version}.jar" />
<fileset dir="build" includes="jbpm*.jar" />
<fileset dir="lib/hibernate" includes="*.jar" />
<fileset dir="lib/bsh" includes="*.jar" />
3. 打開源文件 JbpmSessionFactory.java, 在 getInstance() 方法里, 刪除下面代碼
InitialContext initialContext = new InitialContext(); Object o = initialContext.lookup(jndiName);
將下面這行
instance = (JbpmSessionFactory) PortableRemoteObject.narrow
(o, JbpmSessionFactory.class);
替換為 instance = (JbpmSessionFactory) PortableRemoteObject.narrow
(new JbpmSessionFactory(createConfiguration()), JbpmSessionFactory.class);
4.在 createConfiguration(String configResource) 方法里, 注釋掉這段代碼
String hibernatePropertiesResource = JbpmConfiguration.getString("jbpm.hibernate.properties");
if (hibernatePropertiesResource!=null) { Properties hibernateProperties =
new Properties();
try { hibernateProperties.load( ClassLoaderUtil.getStream(hibernatePropertiesResource) ); }
catch (IOException e) {
e.printStackTrace();
throw new RuntimeException
("couldn't load the hibernate properties from resource '"hibernatePropertiesResource"'", e);
}
log.debug("overriding hibernate properties with "+ hibernateProperties); configuration.setProperties(hibernateProperties);
}
同時(shí)加入下面的代碼
configuration.setProperty("hibernate.dialect", "org.hibernate.dialect.MySQLDialect");
configuration.setProperty("hibernate.connection.driver_class", "com.mysql.jdbc.Driver");
configuration.setProperty("hibernate.connection.url", "jdbc:mysql://localhost:3306/
configuration.setProperty("hibernate.connection.username", "
configuration.setProperty("hibernate.connection.password", "
configuration.setProperty("hibernate.connection.pool_size", "15");
5. 運(yùn)行腳本命令 ant build ant build.webapp -buildfile build.deploy.xml
6. 將jbpm.war 從 'jbpm-3.0\build' 下拷貝到 'tomcat.home\webapps'
7. 啟動(dòng) tomcat
8. 打開瀏覽器 'http://localhost:8080/jbpm'
搬家了,最開始的Blog在JR,斷斷續(xù)續(xù)地亂寫了很多東西。JR最近一直很不穩(wěn)定,Blog也一直沒有更新。站長說是由于網(wǎng)絡(luò) 爬蟲的原因。我也是一天到晚掛在網(wǎng)上,算不算一只網(wǎng)絡(luò)爬蟲?
| |||||||||
日 | 一 | 二 | 三 | 四 | 五 | 六 | |||
---|---|---|---|---|---|---|---|---|---|
25 | 26 | 27 | 28 | 29 | 30 | 31 | |||
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 | 1 | 2 | 3 | 4 | 5 |
常用鏈接
留言簿(38)
隨筆分類
- ajax相關(guān)(9)
- cms(7)
- Head First Process-深入淺出流程(15)
- j2se基礎(chǔ)(6)
- JbpmSide(6)
- OOA/OOD(4)
- SOA、BPM(26)
- 工作日志(24)
- 工作流jbpm3(10)
- 張小慶,在路上(42)
- 心情小站(24)
- 權(quán)限相關(guān)(12)
- 表現(xiàn)層相關(guān)(4)
- 轉(zhuǎn)載(4)
隨筆檔案
- 2013年8月 (1)
- 2012年12月 (1)
- 2012年1月 (3)
- 2011年12月 (2)
- 2011年11月 (2)
- 2011年10月 (3)
- 2011年9月 (3)
- 2011年8月 (7)
- 2011年7月 (4)
- 2011年6月 (3)
- 2011年5月 (5)
- 2011年4月 (6)
- 2011年3月 (4)
- 2011年2月 (2)
- 2010年9月 (1)
- 2010年6月 (1)
- 2010年5月 (1)
- 2010年3月 (4)
- 2010年1月 (2)
- 2009年11月 (5)
- 2009年10月 (4)
- 2009年9月 (1)
- 2009年7月 (1)
- 2009年6月 (2)
- 2009年5月 (2)
- 2009年4月 (1)
- 2009年3月 (4)
- 2009年2月 (2)
- 2008年12月 (1)
- 2008年11月 (1)
- 2008年10月 (1)
- 2008年9月 (2)
- 2008年8月 (2)
- 2008年7月 (2)
- 2008年6月 (3)
- 2008年5月 (4)
- 2008年4月 (1)
- 2008年3月 (2)
- 2008年2月 (2)
- 2008年1月 (4)
- 2007年11月 (3)
- 2007年10月 (3)
- 2007年9月 (2)
- 2007年8月 (4)
- 2007年7月 (1)
- 2007年6月 (12)
- 2007年5月 (2)
- 2007年4月 (1)
- 2007年3月 (8)
- 2007年2月 (6)
- 2007年1月 (4)
- 2006年12月 (4)
- 2006年11月 (3)
- 2006年10月 (1)
- 2006年8月 (2)
- 2006年7月 (3)
- 2006年6月 (3)
- 2006年4月 (1)
- 2006年3月 (2)
- 2006年2月 (2)
- 2006年1月 (4)
- 2005年12月 (7)
- 2005年11月 (12)
文章分類
文章檔案
常去的網(wǎng)站
搜索
最新評論

- 1.?re: 使用Handler來增強(qiáng)Web服務(wù)的功能
- asdfasfd
- --ads
- 2.?re: 使用solr搭建你的全文檢索
-
@木哥哥
你的分詞器用的是什么啊?mmseg貌似可以的 - --陳冠馳
- 3.?re: 使用solr搭建你的全文檢索
-
@marten這是你的solr的schame.xml配置文件有問題。好好檢查下你的配置文件里面的字段什么的配置對著沒
- --陳冠馳
- 4.?re: 討論一下你覺得一個(gè)工作流產(chǎn)品好的標(biāo)準(zhǔn)
- 評論內(nèi)容較長,點(diǎn)擊標(biāo)題查看
- --深圳非凡信息技術(shù)有限公司
- 5.?re: DisplayTag應(yīng)用
- name="test"從哪里來的,千篇一律的到處使用test卻沒有test的定義,sb
- --qige