1、task-node
一個task-node可以包含一個或多個task,這些task分配給特定的user。當流程執行到task-node時,task instance將會被創建,一個task對應一個task instance。task instances 創建后,task-node就處于等待狀態。當所有的task instances被特定的user執行完畢后,將會發出一個新的signal 到token,即流程繼續執行。
2、state state是一個純粹的wait state(等待狀態)。它和task-node的區別就是它不會創建task instances。很典型的用法是,當進入這個節點時(通過綁定一個action到node-enter event),發送一條消息到外部的系統,然后流程就處于等待狀態。外部系統完成一些操作后返回一條消息,這個消息觸發一個signal 到token,然后流程繼續執行。(不常用)
3、decision
當需要在流程中根據不同條件來判斷執行不同路徑時,就可以用decision節點。兩種方法:最簡單的是在transitions里增加condition elements(條件),condition是beanshell script寫的,它返回一個boolean。當運行的時候,decision節點將會在它的 leaving transitions里循環,同時比較 leaving transitions里的condition,最先返回'true'的condition,那個leaving transitions將會被執行;作為選擇,你可以實現DecisionHandler接口,它有一個decide()方法,該方法返回一個String(leaving transition的名字)。
4、fork fork節點把一條執行路徑分離成多條同時進行(并發)的執行路徑,每條離開fork節點的路徑產生一個子token。
5、join
默認情況下,join節點會認為所有到達該節點的token都有著相同的父token。join 節點會結束每一個到達該節點的token,當所有的子token都到達該節點后,父token會激活。當仍然有子token處于活動狀態時,join 節點是wait state(等待狀態)。
6、node
node節點就是讓你掛自己的action用的(注意:不是event觸發?。。?,當流程到達該節點時,action會被執行。你的action要實現ActionHandler接口。同樣,在你的action里要控制流程!
posted @
2005-11-14 16:59 ronghao 閱讀(789) |
評論 (0) |
編輯 收藏
1、process definition
一個process definition代表了一個正式的業務流程,它以一個流程圖為基礎。這個流程圖由 許多node和transition組成。每個node在這個流程圖里都有著各自特殊的類型,這些不同的類型決定了node在運行時的不同行為。一個process definition只有一個start state 。
2、token 一個token代表了一條執行路徑,它包含了這條執行路徑的當前的執行狀態(current state)。
3、process instance
一個process instance(流程實例)即一個process definition(流程定義)的流程執行實例。一個process definition可以對應多個process instance。當一個process instance被創建的時候,一個主執行路徑token同時被創建,這個token叫做root token,它指向流程定義的start state(processDefinition.getStartState()==token.getNode())。
4、signal
一個signal 發送給token通知token 繼續流程的執行。如果signal 沒有指定transition,token將沿缺省的transition離開當前狀態,如果signal 指定transition,token將沿指定的transition離開當前的狀態??丛创a可以看到發給process instance的signal 其實都是發送給了root token。
5、Actions jbpm提供了靈活的action ,當流程執行,token 進入node和transition時,會觸發相應的一些event(事件)。在這些event上附上我們自己寫的action,就會帶動action 的執行。action里是我們自己的相關java操作代碼,非常方便。注意的是event(事件)是內置的,無法擴展。另外,action也可以直接掛在node上,而不依賴于event(事件)的觸發,這個很重要!
posted @
2005-11-12 09:46 ronghao 閱讀(2306) |
評論 (3) |
編輯 收藏
一個Task instance(任務實例)可以被分配給一個actorId (java.lang.String)。所有的Task instance都被保存在數據庫中的表jbpm_taskinstance里。當你想得到特定用戶的任務清單時,你就可以通過一個與用戶關聯的actorId來查詢這張表。
一個流程定義有一個TaskMgmtDefinition;一個TaskMgmtDefinition對應多個swimlane,同時對應多個task;一個swimlane有多個task,可以 TaskMgmtDefinition中通過task的名稱直接獲取相應的task;
swimlane對象有四個屬性,分別是name(名字)、assignmentDelegation(分配代理類)、taskMgmtDefinition、tasks(Set 對應多個task),可以增加task
task對象主要的屬性:taskMgmtDefinition、swimlane、assignmentDelegation、taskNode,需要注意的是swimlane和assignmentDelegation中間只是可以一個屬性有值,因為它們都和任務的分配有關系。
一個流程實例有一個TaskMgmtInstance;一個TaskMgmtInstance對應多個swimlaneInstance,同時對應多個taskInstance;一個swimlaneInstance有多個taskInstance,可以從TaskMgmtInstance中直接獲取相應的taskInstance;
swimlaneInstance對象主要有五個屬性,分別是name、actorId、pooledActors(Set)、swimlane、taskMgmtInstance。
taskInstance對象的主要屬性:name、actorId、task、swimlaneInstance、taskMgmtInstance、pooledActors。
當對任務進行分配時,一般需要實現AssignmentHandler這個接口,這個接口的方法只有一個:
void assign( Assignable assignable, ExecutionContext executionContext ) throws Exception;
一個典型的實現(把名字是'change nappy'的任務交給NappyAssignmentHandler這個類來分配)
<task name='change nappy'>
<assignment class='org.jbpm.tutorial.taskmgmt.NappyAssignmentHandler' />
</task>
NappyAssignmentHandler類:
public void assign(Assignable assignable, ExecutionContext executionContext) {
assignable.setActorId("papa");
}
同樣,Assignable只是一個接口,它有兩個方法:setActorId()和setPooledActors(),Assignable的具體實現類也是兩個
swimlaneInstancehe和taskInstance。這樣就不不難理解整個任務分配流程了:
1、流程進入TaskNode節點,執行TaskNode類的execute()方法,該方法首先獲得TaskMgmtInstance實例,然后通過它來創建TaskInstance。taskMgmtInstance.createTaskInstance(task, executionContext);
2、在上面的createTaskInstance(task, executionContext)里,該方法調用了taskInstance.assign(executionContext)對taskInstance進行分配。
3、在assign(executionContext)方法里,首先會判斷task屬性里是否存在swimlane,如果有的話,這個taskInstance就會分配給swimlane指定的ActorId或 PooledActors;如果不存在,再去找task屬性里 assignmentDelegation(分配代理類)通過代理類(即我們自己寫的實現AssignmentHandler這個接口的類)指定ActorId或 PooledActors。
posted @
2005-11-11 16:39 ronghao 閱讀(3513) |
評論 (3) |
編輯 收藏
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 導入
配置連接 MySQL
1. 在 'jbpm-3.0\lib' 目錄下 創建 'mysql' 目錄
2. 將 mysql數據庫驅動 (mysql-connector-java-3.1.7-bin.jar) 拷貝到 'mysql' 目錄
3. 在 mysql 中創建一個數據庫,數據庫名字
4. 在 'jbpm-3.0\src\resources'目錄下創建 'mysql' 目錄
5. 把兩個配置文件 (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.connection.password=
hibernate.show_sql=true hibernate.query.substitutions=true 1, false 0
hibernate.c3p0.min_size=1 hibernate.c3p0.max_size=3
7. 另一個文件 'identity.db.xml'不做改動
8. 在 'jbpm-3.0' 根目錄, 編輯ANT的腳本 'build.deploy.xml' 找到 target name="create.db", 刪除 db.start, db.stop 在這個目標塊中將所有的'hsqldb' 替換為 'mysql'
9. 運行ANT ant create.db -buildfile build.deploy.xml 運行完畢后就會發現mysql中多出很多表,這是jbpm保持狀態用的
創建 jbpm.war 使其在tomcat中運行
默認的打war包時,掉了一些庫文件
1. 在 eclipse中, 編輯ant腳本 'build.deploy.xml' 在目標塊 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" />
2.因為 Hibernate 不能將它的SessionFactory與tomcat的jndi 綁定 , 我們直接在源碼中修改
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);
}
同時加入下面的代碼
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. 運行腳本命令 ant build ant build.webapp -buildfile build.deploy.xml
6. 將jbpm.war 從 'jbpm-3.0\build' 下拷貝到 'tomcat.home\webapps'
7. 啟動 tomcat
8. 打開瀏覽器 'http://localhost:8080/jbpm'
posted @
2005-11-10 17:31 ronghao 閱讀(3418) |
評論 (5) |
編輯 收藏
搬家了,最開始的Blog在JR,斷斷續續地亂寫了很多東西。JR最近一直很不穩定,Blog也一直沒有更新。站長說是由于網絡 爬蟲的原因。我也是一天到晚掛在網上,算不算一只網絡爬蟲?
posted @
2005-11-09 17:53 ronghao 閱讀(542) |
評論 (0) |
編輯 收藏