jbpm工作流学习心得

一,装载流程:
 第一种:

java 代码
  1. JbpmConfiguration jbpmConfiguration = JbpmConfiguration.getInstance();   
  2. JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext();   
  3.  try {   
  4.   Entity[] entities = IdentityXmlParser   
  5.     .parseEntitiesResource("hsqldb/identity.db.xml");   
  6.   IdentitySession identitySession = new IdentitySession(jbpmContext   
  7.     .getSession());   
  8.   for (int i = 0; i < entities.length; i++) {   
  9.    identitySession.saveEntity(entities[i]);   
  10.   }   
  11.  } finally {   
  12.   jbpmContext.close();   
  13.  }  


 第二种:

java 代码
  1. ProcessDefinition processDefinition = ProcessDefinition.parseXmlString(   
  2.     "<process-definition>" +   
  3.   "  <start-state>" +   
  4.   "    <transition to='s' />" +   
  5.   "  </start-state>" +   
  6.   "  <state name='s'>" +   
  7.   "    <transition to='end' />" +   
  8.   "  </state>" +   
  9.    "  <end-state name='end' />" +   
  10.    "</process-definition>"  
  11.  );  

 


二,创建一个流程实例:
 第一种方法:ProcessInstance processInstance =  new ProcessInstance(processDefinition);
 第二种方法:processInstance = jbpmContext.newProcessInstanceForUpdate("websale");

三,取得流程实例,流程实例数据环境

java 代码

三,创建一个事务实例:TaskInstance taskInstance=processInstance.getTaskMgmtInstance().createStartTaskInstance();

四,创建一个流程实例数据环境:
 ContextInstance contextInstance = processInstance.getContextInstance();
    流程环境变量可以存取变量:contextInstance.getVariable("item");

 

java 代码
  1. TaskInstance taskInstance = createNewProcessInstance();   
  2.      Map taskVariables = new HashMap();   
  3.      taskVariables.put("item""cookies");   
  4.      taskVariables.put("quantity""lots of them");   
  5.      taskVariables.put("address""sesamestreet 46");        
  6.      taskInstance.addVariables(taskVariables);  

五,创建令牌:
 Token token = processInstance.getRootToken();//等于processDefinition.getStartState();

六, 现在开始流程执行,离开start-state 结束默认的转换(transition)
 token.signal();

七,保存事务

java 代码
  1. jbpmContext = jbpmConfiguration.createJbpmContext();   
  2. jbpmContext.close();  

八,jbpm数据库表创建和删除:
 第一种:

java 代码
  1. DbPersistenceServiceFactory dbPersistenceServiceFactory = (DbPersistenceServiceFactory) jbpmConfiguration   
  2.   .getServiceFactory(Services.SERVICENAME_PERSISTENCE);  


 
 第二种:

java 代码
  1. static JbpmSessionFactory jbpmSessionFactory =    
  2.        JbpmSessionFactory.buildJbpmSessionFactory();   
  3.     
  4.  static {   
  5.                 // 因为HSQLDBin-memory数据库是干净的数据库,   
  6.                 // 在我们开始测试前,我们需要建立table.   
  7.      // The next line creates the database tables and foreign key    
  8.      // constraints.    
  9.      jbpmSessionFactory.getJbpmSchema().createSchema();//创建   
  10.   dbPersistenceServiceFactory.dropSchema();//删除   
  11.   }  


九,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 (= 流程角色).

 

java 代码
  1. public interface Assignable {   
  2.     public void setActorId(String actorId);   
  3.     public void setPooledActors(String[] pooledActors);   
  4.  }  

 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元素中指定.
         例

java 代码
  1. task name="clean ceiling">   
  2.          <controller>   
  3.          <variable name="a" access="read" mapped-name="x" />   
  4.          <variable name="b" access="read,write,required" mapped-name="y" />   
  5.          <variable name="c" access="read,write" />   
  6.          </controller>   
  7.     </task>   

    name 属性引用流程变量的.  access 属性指明变量是否readable, writable and  或 required. 这个信息可以用于用户接口来产生正确的表单控制.  access 属性是任意的并且默认 access 是 read,write .mapped-name 是任意的并且表示用户接口的标签用于表示一个参数.

    2)你可以写你自己的 TaskControllerHandler 实现.
    例:

java 代码
  1. public interface TaskControllerHandler extends Serializable {   
  2.        List getTaskFormParameters(TaskInstance taskInstance);   
  3.        void submitParameters(Map parameters, TaskInstance taskInstance);   
  4.     }   
  5.     在jpdl:<task name="clean ceiling">   
  6.        <controller class="com.yourcom.CleanCeilingTaskControllerHandler">   
  7.          -- here goes your task controller handler configuration --   
  8.        </controller>   
  9.      </task>   

 12,身份组件:用户管理,组和权限管理一般都称做身份管理.

 

你可能感兴趣的:(工作,jbpm,Access,HSQLDB)