zoukankan      html  css  js  c++  java
  • activiti学习总结

    Activiti界面元素的使用总结

    一、图形设计中元素的使用

    1SequenceFlow:连接线,可以连接两个任务,来管理流程实例的流向

    -----General

    -----id:流程的id,用与程序内部识别

    -----name流程的名字,用于用户显示识别

    -----Main config

    -----Label width:组件的大小,自动

    -----Condition:执行该流程的条件,可以通过#{}${}结合流程变量来 实现

    -----Listeners:通过类来控制流程的执行,该来要实现TaskListener 口,并重写notify()方法,把要传入的参数传进去。

    2UserTask:个人任务

    ----General:当前任务

    ----id:用于程序内部标示当前任务

    -----name:任务名称:用于在视图上显示当前任务描述

    ----Main config

    ----Assignee:指定单个办理人(有三种方法)

    方法一:直接指定,输入办理人即可

    方法二:通过流程变量指定办理人(使用#{}${}获取流程实例启动 时,通过

    .startProcessInstanceByKey(processDefinitionKey,variables)

    流程变量传入的值)

    方法三:通过类来指定办理人(在该属性下不加任何指定,在Listeners 下指定相关的类,与连接线中的listeners相似)

    delegateTask.setAssignee("指定办理人"

    ----Candidate user(comma separated):指定组任务(三种方式)

    方法一:直接指定,如:小a,b,c,d

    可以在程序中通过

    taskService.addCandidateUser("taskId","userId")添加组成员

    .deleteCandidateUser("taskId","userId")删除组成员

        .claim("taskId","userId");拾取任务,将组任务分配 给个人任务

    .claim("taskId"null);将个人任务退回到组任务(之 前必须是组任务)

    方法二:通过流程变量分配(同个人任务分配一样)

    如:variables.put("userIDs","大大,中中,小小");

    方法三:通过类来分配(同个人任务分配一样),只是在方法内部调 用的是:delegateTas.addCandidateUser()

    或者.addCandidateUsers()方法

    ----Candidate groups(comma separated):指定组任务分配给角色

    可以在流程发布时,设定相应的角色和用户

    添加角色:identityService.saveGroup(new GroupEntity(groupId));

    添加用户:identityService.saveUser(new UserEntity(userId))

    添加两者间的关系:

    identityService.createMembership(userId,groupId)

    ----Form 

    ----Form key:表单id,用于程序内部识别(表单链接)

    表单的三种方式:

    方法一:(动态表单)

    Form属性中指定各个字段

    方法二:(外置表单)

    Main config属性中的Form key字段中指定.form文件的路径

    方法三:(普通表单)

    Main config属性中的Form key字段中指定存放表单的页面 (jsp,html,jsf)

    ----Listeners:

    ----Task listeners:任务监听,在流程启动时,把流程变量,通过TaskListener 口的实现类中的notify方式添加进去

    ----event :

    -----create:创建任务,并设置所有属性后触发

    ----assignment:任务分配给办理人时触发,在create事件之前

    ----complete:任务完成,且尚未从数据库中删除时触发

    ----delete:只在任务删除之前触发。(正常完成时也会触发)

    ----Execution listeners:执行监听器,在任务执行时,调用ExecutionListener 口的实现类中的notify方法

    ----event:对于连续:只能是take(因为连续只能触发take事件,默认该属 性会被忽略)

    对于其他组件:(start end

    ----start:事件开始前调用

    ----end:事件结束后调用

    ----Multi instance:

    ----Sequential:

    -----yes:串行(多个人要按照list集合中的顺序依次完成任务)

    ----no:并行(多个人是同级关系,没有先后,可以同时完成各自的 任务)

    ----Loop  cardinality:产生的实例个数(不能超过list集合的元素个数)

    ----Collection:#{users}接收任务的人员列表,可以在启动流程实例时进行初 始化流程变量users

    例:String [] users={“大大”,”中中”,”小小”};

    Map<String,Object> variables=new HashMap<String,Object>();

    Variables.put(“users”,Arrays.asList(users));

    .startProcessInstanceByKey(processDefintionKey,variables);

    ----Element variable:办理人的环境变量

    例:如果在assignment:中指定为#{user},则该项应为user

    ----Completion condition:完成条件

    可以根据以下三个变量进行设置

    nrOfInstances:实例总数

    nrOfActiveInstances:当前还没有完成的实例

    nrOfCompleteInstances:已经完成的实例个数

    3ExclusiveGateway:排他网关

    根据不同的条件执行不同的流程分支(每次只能执行一个流程分支)

    ----General:(idname和其他组件意义相同)

    ----Default flow:默认执行的流程分支,值为默认流程连接线的id

    4ParallelGateway:并行网关

    可以同时执行多个流程分支

       InclusiveGateway:包含网关

    可以同时分支出多个流程分支(与并行网关一样),和并行网关的区别就在于在分支流线上如果定义了条件,并行网关会忽略,而包含网关会进行相应的解析。

    5ReceiveTask:手动接收任务

    执行到流程中的某个节点后就暂停执行,指定收到外部的信号后才会继续执行

    通过调用runtimeService.signal(executionId);方法,使流程继续向下执行。

    6ScriptTask:脚本任务

    可以执行一段脚本,可以在脚本中定义或修改变量,来控制流程的流转。

    脚本中添加的变量可以再整个流程中使用。execution.setVariable(“变量名”,变量值)

    7ServiceTask:java服务任务

    会调用外部的java

    指定调用的class类的三种方式:

    第一种中方法:

    ----Main config

    -----Type:java class -----Service class:选择外部实现了JavaDelegate或者ActivityBehaviorjava类;

    第二种方法:

    ----Main config

    ----Type:Delegate expression

    ----Delegate expression:${“在spring中定义了的实现了JavaDelegatebean”}

    第三种方法

    ----Main config

    ----Type:Expression

    ----Expression:#{“在spring中配置的javabeanid.所调用的方法”}

    在调用外部java类时,可以注入指段:(两种方式)

    方法一:直接注入

    ----Main config

    ----Field:new时指定Field nameString value

    方法二:使用表达式注入

    ----Main config

    ----=Field:new时,指定File nameExpression()

    表达式中查找的是流程变量或者Spring定义的bean

    ----Result variable:会把上面指定的java类的指定方法的返回值赋给该变量,该 变量可以是一个流程变量,或者springbean

    8、Execution listenersTask Listeners    执行监听和任务监听

    在流程执行期间执行外部的java代码

    -----Event:start(事件开启前调用),end(事件结束后调用)

    TypeField和上面的一样

    9、Email Task邮件任务:(需要在activiti.cfg.xml中配置邮件服务器)

    ----Mian config

    ----To:接受者

    ----From:发送者

    ----Subject:主题

    ----Cc:抄送

    ----Bcc:暗送

    ----Charset:字符集

    ----Html text:邮件内容

    10、CallActiviti:调用外部其他流程

    当流程运行的此时,启动新的流程实例

    ----General:

    ----Default flow:默认流程的流转

    ----Main config

    ----Called Element:被调用的流程的.bpmn文件中的id

    11、SubProcess:调用子流程(可以在SubProcess中配置新的流程,当流程运行到这里时会知 道启动子流程)

    ----id,name和上面的一样

    12、timer:定时器(Main config中的数据格式均为:)

    必选在activiti的配置文件中配置:<property name="jobExecutorActivate"  value="true" />,否则定时任务无法正常启动。

    Main config中的数据格式均为:ISO_8601格式:(P ,Y,M,W,D,T,.H,M,S)或 cron时间格式:

    Iso_8601格式:

    -----Time duration:延时多长时间后触发。例:P10D 表示10天以后触发

    -----time date:什么时间触发。例:2011-03-12T12:12:23 表示在20110312日 12:12:23触发

          ---time cycle:循环规则:

    R【循环次数】【/开始时间】/时间间隔【/结束时间】

    例:R3/PT10 表示重复3次,每次间隔10小时

      从200456日北京时间下午1点起时间间隔半年零53 时循环,且循环3次,可以表示为             R3/2004-05-06T130000+08/P0Y6M5DT3H0M0S

    12个月为循环间隔,无限次循环,最后循环终止于20251    1日,可表示为R/P1Y2M/2025-01-01

     

    Cron 时间格式:seconds minutes hours day-of -mouth mouth,day-of-week year

    其中*表示这个域上所有的合法值

    例:0 * 17 * * ? 表示每天下午5点到559每分钟触发一次

    ?表示不指定该域上的值(只能用在日域或周域上,且不能同时在两 个域上使用,即假如在在其中的一个域上指定了值,必要再另一 个上放?)

    ,表示在某个域上指定一个值列表

    例:0 10,44 14 ? 3 WEB  表示三月中每个星期三的下午2:10 和下午的2:44触发

    表示在某个域上指定一个值范围

    例:0 45 3-8 ? * * 表示上午3点到上午8点的45分时触发

    m/n 表示某个域的值从m开始,按n递增

    例:0/15 0/30 * * * ? 表示整点和半点时每15秒触发

    表示某个域上允许的最后一个值(只能用在日域和周域上,用在 日域上时,表示当月的最后一天触发;用在周域上,表示周的最 后一天,即周六触发)

    例:0 0 12 ? * 2L 表示每个月中的最后一个星期一的12:00触发

    表示里指定日期最近的工作日(只用在日域上,其只能指定单天, 不能指定范围或列表)

    例:在日域上指定15W,那么如果15号是工作日,就在15 触发

    如果15号是周六,就在14号触发

    如果15号是周日,就在16号触发

    表示月份中的第几周的哪一天(只用在周域上)

    例:6#3 表示某个月的第三个星期五

    二、开发流程

    1、配置activiti.cfg.xml文件,里面可以配置要访问的数据库

    <bean id=”processEngineConfiguration” 

    class=”org.activiti.engine.impl.cfg.StandaloneInMemprocessEngineConfiguration>

    <property name=”databaseType” value=”mysql”/>

    <property name=”jdbcUrl” value=”jdbc:mysql://localhost:3306/activiti”/> ......

    <!--在进行过去流程引擎时会自动生成工作流需要的28张表-->

    <property name=”databaseSchemaUpdate” value=”true”/>

    </bean>

    2、获取流程引擎(默认会按照类路径下的activiti.cfg.xml文件生成)

    ProcessEngine processEngine=ProcessEngines.getDefaultProcessEngine();

    3、部署流程定义

    方法一:(从classpath下部署)

    Deployment deployment=processEngine.getRepositoryService()

    .createDeployment()

    .name(“流程名称”)

    .addClasspathResource(“diagrams/helloword.bpmn”)

    .addClasspathResource(“diagrams/helloword.png”)

    .deploy();

    方法二:(从zip文件部署)

    //.bpmn.png文件压缩到helloword.zip文件中

    InputStream inputStream=this.getClass().getClaassLoader().

    getResourceAsStream(“diagrams/helloword.zip”);

    Deployment deployment=processEngine.getRepositoryService()

    .createDeployment()

    .name(“流程名称”)

    .addZipInputStream(new ZipInputStream(inputStream))

    .deploy();

    方法三:(从当前路径下获取)

    要在Build Pah-->configura Build Path--->Source---->某个包下的Included双击

    --->Inclusion pathterns下清空,则会把该包下的所有文件进行编译

    InpuStream inputStreamBpmn=this.getClass().

    getResourceAsStream(“sequenceFlow.bpmn”);//从当前路径下获取

    InpuStream inputStreamBpmn=this.getClass().

    getResourceAsStream(“/sequenceFlow.bpmn”);//从类路径下获取

    Deployment deployment=processEngine.getRepositoryService()

    .createDeployment()

    .name(“流程名称”)

    .addInputStream(“sequenceFlow.bpmn”,inputStreamBpmn)

    .addInputStream(“sequenceFlow.png”,inputStreamPng)

    .deploy();

    4、启动流程实例

    ProcesssInstance processInstance=processEngine.getRuntiomService()

    .startProcessInstanceByKey(“.bpmn文件中流程的id属性的值”)

    5、任务查询

    (1)个人任务查询(只有任务的Main config中的Assignee中指定了办理人才代 表个人任务,才可通过个人任务进行查询)

    List<Task> list=processEngine.getTaskService()

    .createTaskQuery()

    .taskAssignee(“办理人”)//指定办理人

    .list();

    (2)查询组任务

    List<Task> list=processEngine.getTaskService()

    .createTaskQuery()

    .taskCandidateUser(“组成员或者拥有角色的用户”)

    .list();

    a.如果是通过组任务的方式进行的任务分配,即在Mian config中的 Candidate Users中通过逗号分隔指定的一组办理人

    b.如果是通过角色的方式进行的任务分配即在Main config中的

      Candidate groups中指定任务的办理角色

    6、完成任务

    processEngine.getTaskService().complete(“任务id”);

  • 相关阅读:
    How to install VXDIAG Honda, Toyota and JLR SDD software
    16% off MPPS V16 ECU tuning tool for EDC15 EDC16 EDC17
    Cummins INSITE locked and ask for verification code
    How to use BMW Multi Tool 7.3 to replace lost key for BMW X1
    Bleed Brake Master Cylinder with Intelligent Tester IT2
    Porsche Piwis Tester II “No VCI has been detected”,how to do?
    Creader VIII VS. Creader VII+
    How to solve GM MDI cannot complete the installation
    汽车OBD2诊断程序开发 (原文转载,思路很清晰!)
    汽车节温器单片机开发思路
  • 原文地址:https://www.cnblogs.com/lifeone/p/4863234.html
Copyright © 2011-2022 走看看