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”);

  • 相关阅读:
    多窗体
    滚动条
    个人信息调查
    登录页面
    蓝桥杯——放麦子
    java的BigDecimal
    蓝桥杯——判定字符的位置。
    输出日历
    蓝桥杯---简单的计算器
    蓝桥杯--Quadratic Equation
  • 原文地址:https://www.cnblogs.com/lifeone/p/4863234.html
Copyright © 2011-2022 走看看