Activiti5的10分钟入门指南

觉得activiti设计得简单而强大,尝试翻译一下他的10分钟入门指南:

10分钟入门指南

通过一个(非常简单)业务流程,介绍一些基本的Activiti工作流感念和API接口。

使用案例

这个用例叫干脆(straightfoward):有一个公司,暂且叫它BPMCorp。在BPMCorp内部,会计部门每个月都要写一份财务报告给公司的股东。 但在发送给所有股东之前必须经过上级部门的批准

下面涉及的所有文件及代码片段均可以通过Activiti分发的examples范例包中找到,请查看包org.activiti.examples.bpmn.usertask的内容

流程图

如上所述的业务流程可以使用Activiti的可视化流程编辑器 Activiti Modeler查看及编辑 使用BPMN2.0的标准符号则如下图所示:

Activiti5的10分钟入门指南 - rongjih - 拥有自己的梦想,跟随心的召唤
 

这里没有什么特殊的东西,图中看到的是一个 none start event (左边的圆圈),其次是两个 user tasks: "撰写财务报告"”批准财务报告",以 none end event (右边边框加粗型的圆圈) 结束

XML表示

 

上述业务流程的XML表示形式如下所示 (FinancialReportProcess.bpmn20.xml). 流程中包含一些主要的元素 (通过点击链接可以查看更详细的BPMN 2.0 元素的说明):

  • none start event 让我们认识到要开始一个流程。

  • user tasks 声明一个基于用户操作的流程任务. 注意第一个任务是分派用户组 accountancy 的, 而第二个任务是分派到用户组management 的. 查看 分派用户任务章节 可以得到更多怎样分派任务到用户或组的信息。

  • 当到达 none end event 节点后流程就结束。

 

<processid="financialReport"name="每月财务报告处理流程">
 
 
<startEventid="theStart"/>
   
 
<sequenceFlowid='flow1'sourceRef='theStart'targetRef='writeReportTask'/>
   
 
<userTaskid="writeReportTask"name="撰写财务报告">
   
<documentation>
      撰写要发送给公司股东的每月财务报告。
   
</documentation>
   
<potentialOwner>
     
<resourceAssignmentExpression>
       
<formalExpression>accountancy</formalExpression>
     
</resourceAssignmentExpression>
   
</potentialOwner>
 
</userTask>
   
 
<sequenceFlowid='flow2'sourceRef='writeReportTask'targetRef='verifyReportTask'/>
     
 
<userTaskid="verifyReportTask"name="批准财务报告">
    <documentation>
      核实并批准会计部门提交的每月财务报告,报告将发送给公司的所有股东们。  
   
</documentation>
   
<potentialOwner>
     
<resourceAssignmentExpression>
       
<formalExpression>management</formalExpression>
     
</resourceAssignmentExpression>
   
</potentialOwner>
 
</userTask>
   
 
<sequenceFlowid='flow3'sourceRef='verifyReportTask'targetRef='theEnd'/>
     
 
<endEventid="theEnd"/>
     
</process>

 

开始一个流程实例

现在我们有了业务流程的流程定义(process definition)。通过这个流程定义我们就可以创建一个流程实例(process instances)了。在这个用例中,一个流程实例将和每月财务报告的创建和批准项匹配。

为了能够通过一个流程定义创建一个流程实例,我们必须先将定义的流程发布(deploy),发布流程意味着两件事:

  • 流程定义保存到Activiti引擎的持久化数据库中。通过发布业务流程,我们就能确保就算在引擎重启后也能够找到该流程的定义。

  • BPMN2.0流程定义文件将被解释到内存中,从而可以通过activiti的API执行相应的操作。

更详细的信息可以通过专门的发布流程章节获取。

就像专门的发布流程章节中提及的,可以通过多种方式来发布流程,以下是其中的一种

Deployment deployment = repositoryService.createDeployment()
 
.addClasspathResource("org/activiti/examples/bpmn/usertask/FinancialReportProcess.bpmn20.xml")
 
.deploy();

 

现在我们可以通过在流程id(看XML流程定义文件中的第一行)来初始化一个流程实例了。注意这个id在Activiti的术语中称为key。

ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("financialReport");

一经上面的初始化将立即通过流程的start event,在start event.之后,紧跟着就是流出流向(在这个用例中只有一条)和到达第一个任务(撰写财务报告)。Activiti引擎将保存一个任务到数据库中。这时候附属于该任务的相关用户或用户组的作业也会被保存到数据库中

任务创建后,处于等待接收状态,引擎将仅在下次接收到而外的触发调用后才会继续下去。在这个节点,任务是分派到用户组的,意指该用户组中的任何人都可以作为这个任务的候选者来执行这个任务。

任务列表

现在我们可以通过taskService来获取用户的任务列表了

List<Task> tasks = taskService.createTaskQuery().taskCandidateUser("fozzie").list();

因为流程定义中这个任务是定义为分派到用户组accountancy的,因此方法中传入的用户名参数"fozzie"必须是属于该用户组的用户:

 

<potentialOwner>
  <resourceAssignmentExpression>
    <formalExpression>accountancy</formalExpression>
  </resourceAssignmentExpression>
</potentialOwner>

也可以通过任务的查询API,如下获取用户组的任务:

 

List<Task> tasks = taskService.createTaskQuery().taskCandidateGroup("accountancy").list();

 

上面描述的业务流程已经发布到了演示数据中。在运行ant demo.start后,以用户fozzie(他是一个会计师)身份登录到Activiti Explorer,选择PROCESSES页签,在列表的Action列中点击流程“Monthly financial report'”的“Start Process"链接来启动一个流程实例。如下图所示:

Activiti5的10分钟入门指南 - rongjih - 拥有自己的梦想,跟随心的召唤

正如前面解解释的,流程将运行到第一个任务处。由于我们是以用户fozzie登录,故在我们启动了这个流程实例后,可以看到一个新的候选任务。我们这是切换到TASKS页签页去看看这个新任务(如下图),可以发现就算其他人启动的流程实例,所有属于用户组accountancy的用户都可以看到这个新的候选任务。

Activiti5的10分钟入门指南 - rongjih - 拥有自己的梦想,跟随心的召唤

 

领取任务

现在其中一个会计人员需要领取这个任务(claim the task)。通过领取任务操作,特定的用户就会成为这个任务的代理人(assignee),这是这个任务就会从用户组accountancy的其他所有用户的列表视图中消失。领取任务的调用代码如下:

taskService.claim(task.getId(),"fozzie");

现在这个任务成为了任务领取者的个人任务了。

List<Task> tasks = taskService.createTaskQuery().taskAssignee("fozzie");

 

通过Activiti Explorer界面点击claim按钮将执行相同的领取任务操作。现在这个任务将显示在任务领取者的个人任务列表中,如下图所示:

Activiti5的10分钟入门指南 - rongjih - 拥有自己的梦想,跟随心的召唤

 

完成任务

现在会计员可以开始撰写财务报表了,一但报表撰写完毕,就可以执行完成任务的操作将任务完成掉:

taskService.complete(task.getId());

 

对Activiti引擎来说,这是通知流程实例必须继续跑下去的额外信号。该任务的外出流向将被解析执行,引导到第二个任务(批准财务报告)。同样的原理,就像上面第一个任务所发生的事情一样将在第二个任务出发生,唯一不同的是这次任务将被分派到用户组management

在上面的demo中,使它能够过点击complete按钮来完成任务的。因Frozzie不是管理者,所以我们需要注销并以kermit(他是管理者)用户登录。第二个任务现在就显示在待指定任务列表中了。如下图所示:

Activiti5的10分钟入门指南 - rongjih - 拥有自己的梦想,跟随心的召唤

 

结束流程

这个批准任务就像第一个任务的处理一样可以接受和领取。完成这个任务将导致流程执行到end event节点,在这个节点将终止该流程实例。该流程实例以及所有与其相关的运行时期的执行数据将会从数据库中删除。

可以通过 Activiti Probe来证实这些数据已被清除。因为表中已经没有任何流程的执行数据。

Activiti5的10分钟入门指南 - rongjih - 拥有自己的梦想,跟随心的召唤

 

 

很容易看出来上面谈及的业务流程因太简单而无法在现实中使用到。然而通过上述基于BPMN2.0在Activiti的构建,你将可以通过如下的手段来增强业务流程的功能:
  • 通过定义一个 timer start event 节点每月自动开始启动流程。

  • 定义 gateways 节点执行条件判断。为此,管理者可以拒绝财务报表让会计师重建原来的任务。

  • 通过声明和使用变量(variables),控制报告在表单的编辑权限。

  • 通过在流程结束时定义一个service task任务将报告自动发送给所有股东。.

  • ...

首先,Activity是Android系统中的四大组件之一,可以用于显示View。Activity是一个与用记交互的系统模块,几乎所有的Activity都是和用户进行交互的,但是如果这样就能说Activity主要是用来显示View就不太正确了。 在深入了解Activity之前,我们先要知道一下MVC设计模式,在JAVAEE 中MVC设计模式已经很经典了,而且分的也比较清晰了,但是在Android中,好多人对MVC在Android开发中的应用不是很清楚,下面我就先来介绍一下MVC在Android开发中的应用: M(Model 模型):Model是应用程序的主体部分,所有的业务逻辑都应该写在这里,在Android中Model层与JavaEE中的变化不大,如:对数据库的操作,对网络等的操作都放在该层(但不是说它们都放在同一个包中,可以分开放,但它们统称为Model层)。 V(View 视图):是应用程序中负责生成用户界面的部分,也是在整个MVC架构中用户唯一可以看到的一层,接收用户输入,显示处理结果;在Android应用中一般采用XML文件里德界面的描述,使用的时候可以非常方便的引入,当然也可以使用JavaScript+Html等方式作为View。 C(Controller控制层)android的控制层的重任就要落在众多的activity的肩上了,所以在这里就要建议大家不要在activity中写太多的代码,尽量能过activity交割Model业务逻辑层处理。 好了,在介绍过Android应用开发中的MVC架构后,我们就可以很明确的知道,在Android中Activity主要是用来做控制的,它可以选择要显示的View,也可以从View中获取数据然后把数据传给Model层进行处理,最后再来显示出处理结果。 介绍过Activity的主要作用后,那么我们就要详细说一下Activity了。 Activity生命周期图 Activity 的生命周期是被以下的函数控制的。 public class Activity extends ApplicationContext { protected void onCreate(Bundle icicle); protected void onStart(); protected void onRestart(); protected void onResume(); protected void onFreeze(Bundle outIcicle); protected void onPause(); protected void onStop(); protected void onDestroy(); } onCreate(Bundle) 函数是你进行初始化的地方,这个也是执行 setContentView(View)函数的地方,setContentView(View)函数可以传入一个由XML 编制的UI界面,可以使UI和具体实现完全分离。 onPause()函数是处理用户离开当前 Activity 的地方。更重要的是,任何在当前 Activity中的任何改变都要在这个函数中提交。 Activity有四种状态: 活动状态,当Activity处于Stack(栈)顶时,就是手机当前的现实屏幕,这是 Activity就 处于activity或者运行状态。 运行但是失去焦点,当Activity还处于运行状态时,但是屏幕是有另外一个Activity 处于文档处于焦点状态,当前的Activity就处于pause。 停止,当Activity被另一个Activity完全覆盖的时候,就被停止了,其实就是虽然在 运行,但是用户却看不见。 结束,当Activity处于pause或者stop时,系统可以结束 Activity,回收资源,这 是Activity就是处于结束状态了。 处于结束状态的是Activity,如果要使用户可见,只要重启才可以。 Activity的响应时间 当前Activity所在的线程为主线程,它的响应时间为5秒,如果在当前运行的Activity中进行耗时的操作且响应时间起过5秒,那么程序就会报ANR错误。所以,这也是不建议在Activity中写太多复杂代码的原因之一。 当然,有些代码只能写在Activity中,不然就运行不了(它们不是生命周期方法),比如你想要获得android系统或者硬件一的些信息,就必须在Activity中写出来,如果单独写一个工具类获得不了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值