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 阅读(780) |
评论 (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离开当前的状态。看源代码可以看到发给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 阅读(2273) |
评论 (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 阅读(3504) |
评论 (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 阅读(3406) |
评论 (5) |
编辑 收藏
搬家了,最开始的Blog在JR,断断续续地乱写了很多东西。JR最近一直很不稳定,Blog也一直没有更新。站长说是由于网络 爬虫的原因。我也是一天到晚挂在网上,算不算一只网络爬虫?
posted @
2005-11-09 17:53 ronghao 阅读(534) |
评论 (0) |
编辑 收藏