一,装载流程:
第一种:
- JbpmConfiguration jbpmConfiguration = JbpmConfiguration.getInstance();
- JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext();
- try {
- Entity[] entities = IdentityXmlParser
- .parseEntitiesResource("hsqldb/identity.db.xml");
- IdentitySession identitySession = new IdentitySession(jbpmContext
- .getSession());
- for (int i = 0; i < entities.length; i++) {
- identitySession.saveEntity(entities[i]);
- }
- } finally {
- jbpmContext.close();
- }
第二种:
- ProcessDefinition processDefinition = ProcessDefinition.parseXmlString(
- "<process-definition>" +
- " <start-state>" +
- " <transition to='s' />" +
- " </start-state>" +
- " <state name='s'>" +
- " <transition to='end' />" +
- " </state>" +
- " <end-state name='end' />" +
- "</process-definition>"
- );
二,创建一个流程实例:
第一种方法:ProcessInstance processInstance = new ProcessInstance(processDefinition);
第二种方法:processInstance = jbpmContext.newProcessInstanceForUpdate("websale");
三,取得流程实例,流程实例数据环境
三,创建一个事务实例:TaskInstance taskInstance=processInstance.getTaskMgmtInstance().createStartTaskInstance();
四,创建一个流程实例数据环境:
ContextInstance contextInstance = processInstance.getContextInstance();
流程环境变量可以存取变量:contextInstance.getVariable("item");
- TaskInstance taskInstance = createNewProcessInstance();
- Map taskVariables = new HashMap();
- taskVariables.put("item", "cookies");
- taskVariables.put("quantity", "lots of them");
- taskVariables.put("address", "sesamestreet 46");
- taskInstance.addVariables(taskVariables);
五,创建令牌:
Token token = processInstance.getRootToken();//等于processDefinition.getStartState();
六, 现在开始流程执行,离开start-state 结束默认的转换(transition)
token.signal();
七,保存事务
- jbpmContext = jbpmConfiguration.createJbpmContext();
- jbpmContext.close();
八,jbpm数据库表创建和删除:
第一种:
- DbPersistenceServiceFactory dbPersistenceServiceFactory = (DbPersistenceServiceFactory) jbpmConfiguration
- .getServiceFactory(Services.SERVICENAME_PERSISTENCE);
第二种:
- static JbpmSessionFactory jbpmSessionFactory =
- JbpmSessionFactory.buildJbpmSessionFactory();
- static {
- // 因为HSQLDBin-memory数据库是干净的数据库,
- // 在我们开始测试前,我们需要建立table.
- // The next line creates the database tables and foreign key
- // constraints.
- jbpmSessionFactory.getJbpmSchema().createSchema();//创建
- dbPersistenceServiceFactory.dropSchema();//删除
- }
九,jbpm session创建
JbpmSession jbpmSession = jbpmSessionFactory.openJbpmSession();
十,任务分派
在jBPM, 推 和 拉l 模式 (看下面) 的任务分派可以组合使用. 流程能计算任务的责任并把它"推"到他/她的任务清单里(tasklist).或者另外的方法, 把任务分配给参与者池, 这种情况下池中的每一个参与者可以"拉"任务并且把它们放到参与者个人的任务清单中(tasklist).
1,分配接口:通过接口AssignmentHandler来分配任务实例:
public interface AssignmentHandler extends Serializable {
void assign( Assignable assignable, ExecutionContext executionContext );
}
一个分配handler实现在任务实例建立的时候被调用. 在这个时候,任务实例可以分配给一个或多个参与者.
2,AssignmentHandler 实现可以调用 Assignable 方法(setActorId或 setPooledActors )来分配任务.
可分配的要么是一个 TaskInstance 或者 SwimlaneInstance (= 流程角色).
- public interface Assignable {
- public void setActorId(String actorId);
- public void setPooledActors(String[] pooledActors);
- }
3, 分配一个TaskInstance给用户, 调用 Assignable.setActorId(String actorId) .
分配一个TaskInstance给候选参与者池, 调用 Assignable.setPooledActors(String[] actorIds).
4,流程中的每个任务都可以用在运行时间执行分配handler的实现关联起来.
5,推模式:任务实例的actorId 表明对指定任务责任的. TaskInstance 缓存的参与者是任务参与者的候选人.
典型的,TaskInstance 的actorId将引用一个用户. 缓存的参与者可以引用用户和组.
6,拉模型:
获取集中的任务典型两个步骤操作:
1)从身份组件得到给定用户所有的组
2)根据用户的actorId和从用户组得到的actorId来得到所有共有的任务
得到给定用户的所有共有的任务的清单通过方法 TaskMgmtSession.findPooledTaskInstances(String actorId) 或 TaskMgmtSession.findPooledTaskInstances(List actorIds) .
为了防止多个用户在同一个共有的任务上工作, 更新TaskInstance 为用户的actorId就可以了.
做了这个, 任务实例将不会显示在共有的任务清单里,但只在用户的个人任务清单里.
设置TaskInstance 的actorId 为null,将会把任务实例放回共有的任务里.
7,个人任务清单是所有所有指定actorId作为用户的 TaskInstances.这个清单的获得是用过 TaskMgmtSession.findTaskInstances(String actorId).
8,泳道:泳道(swimlane)是流程角色
所有分派是在给定swimlane任务实例上完成.
9,任务事件:任务有动作关联. 有4个标准任务事件类型定义: task-create, task-assign, task-start 和 task-end.
task-create 在任务实例建立的时候被产生.
task-assign 当任务实例被分配的时候产生.你可以访问前一个参与者通过 executionContext.getTaskInstance().getPreviousActorId()
task-start 是当 TaskInstance.start()被调用时产生 .
task-end 当 TaskInstance.end(...)被调用时产生 .
10,任务定时器:任务定时器指明的事情是 cancel-event 可以定制的.默认的, 任务上的定时器在任务结束时,将被放弃 (= 完成).
cancel-event 类型能被用逗号分隔的多个事件列表.
11,任务控制器:任务是用来收集用户输入的.任务控制器为用户接口应用程序提供流程变量的视图.
任务控制器有2个责任:第一个, 从流程变量里提取信息. 从流程变量里提取的信息表示作为一个指定的参数的集合.参数用做来自用户接口表单的输入. 第二个责任是保存用户提交的参数到流程变量里.
输入流程变量的二种方式:1)任务控制器在task元素中指定.
例
- task name="clean ceiling">
- <controller>
- <variable name="a" access="read" mapped-name="x" />
- <variable name="b" access="read,write,required" mapped-name="y" />
- <variable name="c" access="read,write" />
- </controller>
- </task>
name 属性引用流程变量的. access 属性指明变量是否readable, writable and 或 required. 这个信息可以用于用户接口来产生正确的表单控制. access 属性是任意的并且默认 access 是 read,write .mapped-name 是任意的并且表示用户接口的标签用于表示一个参数.
2)你可以写你自己的 TaskControllerHandler 实现.
例:
- public interface TaskControllerHandler extends Serializable {
- List getTaskFormParameters(TaskInstance taskInstance);
- void submitParameters(Map parameters, TaskInstance taskInstance);
- }
- 在jpdl:<task name="clean ceiling">
- <controller class="com.yourcom.CleanCeilingTaskControllerHandler">
- -- here goes your task controller handler configuration --
- </controller>
- </task>
12,身份组件:用户管理,组和权限管理一般都称做身份管理.