bdi一个招投标流程的时间节点包里面包含哪些节点

数字包封技术 - 摘要
介绍了在最新定版的G.709标准中采用的,分析其开销的应用方法和采用的前向点击查看大图。并介绍了数字包封技术的设计。最后举例说明了各种开销的应用方法。&&&&
数字包封技术 - 关键词
数字包封技术 - 正文
数字包封技术 1 引言   人类社会已进入信息时代,INTERNET的飞速发展带来了信息爆炸。成为解决带宽问题的最佳方案,WDM(波分复用)技术作为光通信系统扩容的首选方案已经得到了广泛的应用,并逐渐从长途骨干网的应用向城域网和接入网渗透。WDM系统不仅能提高传输容量,而且具有联网的潜力和实用价值。WDM系统的建设也从原来的点对点系统向光传送网(OTN)发展。光传送网的建设,为在光层上提供快速的保护和恢复功能,并能实现光路上的交换,提供了坚实的基础。  针对光传送网势不可挡的发展趋势,(ITU)推出了一系列标准,其中尤以2001年2月推出的G.709建议具有重大意义,它指出了光联网的技术基础。G.709建议的核心内容就是数字包封技术(DigitalWrapper),它定义了一种特殊的帧格式,将客户信号封装入帧的载荷单元,在头部提供用于运营、管理、监测和保护(OAM&P)的开销字节,并在帧尾提供了前向纠错(FEC)字节。2 数字包封技术& & 数字包封技术采用的标准帧格式如图1所示。& & 从图中可以看出,数字包封采用标准帧是4行4 080列帧格式。头部16列为开销字节,尾部255列为FEC校验字节,中间3 808列为净荷。头部开销字节的定义如图2所示。  其中,第一行1~7列为帧定位字节,8~14字节为k开销字节,第2~4行1~14列为ODUk开销字节,第15、16列为OPUk开销字节。下面介绍其功能和作用。2.1 OTUk开销字节  OTUk(Optical Channel Transport Unit)开销字节提供了OTN中3R再生节点之间传输信号状态的监测功能。包含以下三个部分:  (1)SM(Section Monitoring)—段监测开销字节& & SM开销的定义如图3所示。数字包封技术   TTI(TrailTrace Identifier)—路径跟踪标识提供连接监测功能。它是64字节。  (Source Access Point Identifier)—源接入点标识。  (Destination Access Point Identifier)—宿接入点标识。  以上两个标识符必须是全球唯一的,以便于全网的管理和运营,具体格式G.709中对此有建议。& & BIP-8—OTUk SM错误检测码  OPUk(15~3 824列)区域校验字节。提供OTUk中净荷的误码监测功能。  BEI(Backward Error Indication)—后向错误指示。向上游节点提供信号误码指示。  BDI(Backward Defect Indication)—后向缺陷指示。向上游节点提供信号失效指示。  IAE(Incoming Alignment Error)—入局帧定位错误向它对应的出口节点提供帧定位错误告警。  (2)GCC0是为两个OTUk终端之间提供通信信道的开销字节,格式未在建议中规定。& & (3)RES是为将来的标准提供的保留字节。2.2 ODUk开销字节  ODUk(OpticalChannel Data Unit)开销提供级联连接监测、端到端的通道监测和通过OPUk提供客户信号适配。ODUk提供了丰富的开销字节(第2~4行1~14列)以完成上述功能。(1)M(Path Monitoring)开销通道监测开销提供端到端的通道监测功能,共3个字节,其定义如图4所示。其中TTI等字节的定义和功能与OTUk中的相应字节近似,不同之处在于它提供的是ODUk中的使用功能。STAT位提供了通道状态信息。& &(2)开销  TCM开销的定义与PM开销定义相同,G.709帧结构共提供了6个TCM开销。TCM开销使复杂光网络能在光通道层提供管理、监测、运营和保护能力。它可以用在以下网络应用中:  ——光UNI到UNI级联连接监测;通过公共传送网的ODUk级联监测。& && &——光到NNI级联连接监测;通过单个运营网络的ODUk连接监测。  ——对1+1、1:1和1:n光通道子层连接保护倒换的子层监测,从而决定信号失效和信号恶化情况。  ——对光通道共享保护环保护倒换子层监测,从而决定信号失效和信号恶化情况。  ——对光通道级联连接进行监测,以检测在光通道交换连接中的信号失效和信号恶化情况,在网络中出现故障和错误时自动恢复连接。  ——监测光通道级联连接,如:差错定位和验证服务传送质量。& &(3)CM ACT& & TCM Active/Deactivation字节,有待研究。 & &(4)CC1,GCC2  提供任何两个接受ODUk帧结构的网络单元之间的通信信道。& &(5)APS/PCC  自动保护倒换和保护通信信道开销字节,有待研究。  (6)FTFL(Fault type and fault locationreporting )  提供故障类型和故障定位信息,它是256个字节的复帧。& & (7)EXP& & 两个字节的供实验使用的开销字节。2.3 OPUk开销字节  OPUk是由客户信号映射进的净荷与其相关开销组成,OPUk开销定义如图5所示。& &(1)PSI—Payload Structure Identifier净荷结构标识,256字节的复帧。PT—Payload Type,客户信号类型指示。RES—保留字节。& &(2)Mapping Specific Overhead映射相关开销。JC—Justification Control码速调整控制字节。  NJO—Negative Justification Opportunity 负码速调整机会字节。  PJO—Positive Justification Opportunity 负码速调整机会字节。  这三个字节由映射过程产生。3 前向纠错技术  在数字包封的标准帧中采用的是16字节比特间插RS(255,239)码,它是一种线性循环码。FEC处理使增加了7.14%,可纠正的突发误码为8字节,检测能力为16字节。在OTUk帧的FEC处理过程如图6所示,它将OTUk的每一行用比特间插的方法分割成16个FEC子行,每个FEC编码/解码器处理其中一个子行,FEC奇偶校验针对每个子行的239字节信息位进行,16个校验位置于其后。 3.1& &FEC编码算法与结构 & & RS(255,239)码的产生多项式  FEC码字(FEC子行)包含信息字节和校验字节,可由如下多项式表式  C(z)=I(z)+R(z)&&信息字节部分&&式中,Dj(j=16 to 254)为信息字节,D254对应FEC子行中的第一个字节,而D16对应第239字节,并表示为伽罗华域GF(256)中的一个元素 &&式中,d7j为信息字节的最高位,而d0j代表最低位。校验字节部分&&式中,Rj(j=0 to 15)为校验字节,R15对应FEC子行中的第240字节,而R0对应第255字节,并表示为伽罗华域GF(256)中的一个元素 &&式中,r7j为信息字节的最高位,而r0j代表最低位。R(z)由下式计算  R(z)=I(z)mod G(z)&&综上所述,FEC码字(子行)的结构如图7所示。 &&FEC对系统性能的改善可参考文献[3]。4 数字包封技术的实现与应用 4.1 数字包封功能的系统实现  上面已经介绍了数字包封技术采用的帧结构以及各种开销,FEC算法,客户信号的映射及维护信号,下面介绍其硬件实现方式。同SDH开销处理一样,数字包封的各种开销也采用专用芯片(ASIC)来实现,现有的芯片设计技术和生产技术已能在一个3 cm×3 cm封装的芯片上实现数字包封功能,功耗不会超过5 W。  数字包封技术是用于OTN的接口,它最主要的使用方式有两种。一种是将客户信号映射进数字包封所定义的帧格式中,加入相关开销,并通过网络传输。另一种则是把已经经过数字包封并在网络中传输的信号解下来,处理其中的开销,以完成相关功能。这是相反的两种方式,它们相互配合,以完成所赋予的各种功能。  数字包封技术用于OTN的接口,因此相应的它应用在目前的OTU(光传送单元)中,完成将SDH信号数字包封和信号解包封的功能,以及在光传送网中作中继器。图8为采用数字包封技术的适配功能(Adaptor)OTU结构示意图。& && &光收发一体模块  光收发一体模块作为系统端的光口,将系统传来的光信号变为电信号或反之。光收发一体模块有比较成熟的产品,都符合LUCENT的多源协议。封装为2×10针的带激光器监测功能,2×5封装的不带监测功能。CDR&/MUX  CDR是和数据再定时芯片。DeMUX是解复用芯片,将高速串行信号解为低速并行信号。MUX是复用芯片,与DeMUX功能正好相反。DigitalWrapper&& 此芯片完成数字包封与解包封功能,提供了开销处理的输出口。& && &长距离光收/发模块  长距离光收模块采用了高灵敏度的APD接收机,将从远端接收的光信号变为电信号。在光收模块中通常带有CDR,则后面将不再需要CDR。发模块采用带温度和功率控制的激光器,具有稳定的符合ITU建议的波长,以及其它相关指标,以将电信号变为光信号,在WDM光网络中传输。  以上模块构成信号主通道,完成O/E/O变换,3R功能在此实现。& && &MCU模块  MCU部分完成与网管的通信,本盘的性能采集、监测、告警、控制等功能。  MCU部分可采用成熟的8位机,由具体情况决定。& && &FPGA模块  FPGA完成光通道层开销的读入和读出,以及提供扩展I/O口等,与MCU协同工作。& && &电源模块  电源模块部分为整个盘上的器件和芯片提供工作电压。4.2 数字包封技术的应用  数字包封技术不仅能提高信号传输的质量,而且为光传送网提供了丰富的运营、管理、监测、保护开销,为光网络的发展提供了坚实的技术基础。表1是对目前几种光传输中采用技术的比较,从表中可以看出,数字包封技术为光传送网提供了最强大的功能。 SDH+:通过定义未使用的开销来增强SDH功能。*仅能提供有限的功能  数字包封技术提供了丰富的开销,在前面我们已对各种开销的功能和结构作了介绍,下面就在实际网络中这些开销的使用举例说明。&& 图9为一个光传送网的示意图。在图中,USER1要使用这个光网络将信息传送到USER2端。NO—Network Operator,NO—A~NO—D代表四个网络运营商,用户的信息就要从他们的网络中经过。其中,B运营商和C运营商又是各自从A运营商处租用的网络B和网络C,B和C是A的子网络。图中,三角形代表网络中使用的终端设备,它负责完成相应的开销处理。图中箭头所指示的R1和R2表示线路中使用的3R。  USER1的终端设备对信号进行数字包封,加入相应的开销。其中,在ODUk中的PM开销中填入正确的信息,监测信号在整个通道中的传输,在OTUk中加入正确开销信息,以便在3R再生处处理。发出的信号首先传送到网络运营商A的网络接口处,A将接收的信号进行监测处理,如进行FEC,加入自己所需的相应开销字节。运营商A除在OTUk中加入相应的信息外,还会使用ODUk中的TCM1作为级联连接监测。信息继续传送到运营商B的网络接口处,B在检测OTUk开销,进行误码检测和纠错后,加入正确的OTUk开销,使用ODUk中的TCM2作为自己的级联连接监测开销。在每一个3R再生处,都会有相应的OTUk开销的取出和加入,以及检错或纠错。在网络B的出口处,相应的终端设备会终结网络B中使用的级联监测开销TCM2,它能反映出信号在网络中传输是否正确。网络C同B中的流程一样,它可以使用除TCM1外的其它TCMi作为级联监测开销。信号经过网络C后,又传送到网络A的出口,A利用TCM1可以检查信号在整个网络A中传输的状态。网络D在入口和出口处执行同样的功能,只不过它可以使用任意的TCMi作级联监测用。信号通过网络D达到USER2,USER2使用ODUk中的PM开销可以监测信号整个信道中的传输质量。光传送网中的3R再生器使用OTUk开销。  从上面的分析可以看出,TCM开销为复杂网络的管理带来了极大的方便。网络服务提供商可以用它来监视提供服务的质量,运营商可以用来监视自己网络的运营状况,即使在各个子网有重叠,嵌套等情况下,也能提供有效的监测手段,从而使整个网络可以以非常灵活的方式运营和管理。   图10就是TCM使用方式的示例。在图中,A1—A2使用TCM1作监测,B1和B2之间使用TCM2,C1—C2使用TCM3,它是嵌套在B1—B2和A1—A2中,同时B1—B2也是嵌套在A1—A2中。D1—D2使用TCM3,也可以使用TCM4~TCM6,注意此TCM3与C1—C2中的TCM3不冲突,两个的作用域不同。B1—B2与D1—D2有重叠。  数字包封技术为保护倒换提供了4个字节的开销。目前的APS开销是使用OSC来传递的,需要增加额外带宽开销,OSC信息的传送不是“随路”的,为了可靠地传送环路信息,OSC信号需占用足够的带宽。而ODUk开销内提供了APS开销字节,可以随路传送。当然这需要有OCh开销处理单元,降低了透明度,但对于目前的非全光网络,3R再生器广范应用的网络中,不失为一种有效的保护方式。图11为数字包封技术中APS开销的应用示例。   图中是一个两纤共享保护环。对A—D间客户1和2的通信,Wλk和Wλj是工作波长,Pλk和Pλj是保护波长,在平时可传送一些额外业务。当A、D之间的光纤发生故障,则利用保护波长中的ODUk中提供的APS开销字节,传送APS信息给发端,使信号经保护波长传送。
为本词条添加和相关影像
互动百科的词条(含所附图片)系由网友上传,如果涉嫌侵权,请与客服联系,我们将按照法律之相关规定及时进行处理。未经许可,禁止商业网站等复制、抓取本站内容;合理使用者,请注明来源于。
登录后使用互动百科的服务,将会得到个性化的提示和帮助,还有机会和专业认证智愿者沟通。
您也可以使用以下网站账号登录:
此词条还可添加&
编辑次数:
参与编辑人数:
最近更新时间: 07:53:58
贡献光荣榜
扫描二维码用手机浏览词条
保存二维码可印刷到宣传品
扫描二维码用手机浏览词条
保存二维码可印刷到宣传品21428人阅读
/view/bbdaef5ff73d32.html
1. 初识Activiti
1.1. 工作流与工作流引擎
工作流(workflow)就是工作流程的计算模型,即将工作流程中的工作如何前后组织在一起的逻辑和规则在计算机中以恰当的模型进行表示并对其实施计算。它主要解决的是“使在多个参与者之间按照某种预定义的规则传递文档、信息或任务的过程自动进行,从而实现某个预期的业务目标,或者促使此目标的实现”。(我的理解就是:将部分或者全部的工作流程、逻辑让计算机帮你来处理,实现自动化)
所谓工作流引擎是指workflow作为应用系统的一部分,并为之提供对各应用系统有决定作用的根据角色、分工和条件的不同决定信息传递路由、内容等级等核心解决方案。
例如开发一个系统最关键的部分不是系统的界面,也不是和数据库之间的信息交换,而是如何根据业务逻辑开发出符合实际需要的程序逻辑并确保其稳定性、易维护性和弹性。
比如你的系统中有一个任务流程,一般情况下这个任务的代码逻辑、流程你都要自己来编写。实现它是没有问题的。但是谁能保证逻辑编写的毫无纰漏?经过无数次的测试与改进,这个流程没有任何漏洞也是可以实现的,但是明显就会拖慢整个项目的进度。
&工作流引擎解决的就是这个问题:如果缺乏强大的逻辑层,势必变得容易出错(信息的路由错误、死循环等等)。
1.2. BPMN2.0规范
BPMN(Business Process Model and Notation)--业务流程模型与符号。
BPMN是一套流程建模的标准,主要目标是被所有业务用户容易理解的符号,支持从创建流程轮廓的业务分析到这些流程的最终实现,知道最终用户的管理监控。
通俗一点其实就是一套规范,画流程模型的规范。流程模型包括:流程图、协作图、编排图、会话图。详细信息请google。
1.3. Activiti概述
1.3.1. Activiti由来
学习过Activiti的朋友都知道,Activiti的创始人也就是JBPM(也是一个优秀的BPM引擎)的创始人,从Jboss离职后开发了一个新的BPM引擎:Activiti。所以,Activiti有很多地方都有JBPM的影子。所以,据说学习过JBPM的朋友学起Activiti来非常顺手。
由于本人之前没有工作流及JBPM的相关基础,刚开始学习Activiti的时候可以说是无比痛苦的,根本不知道从何下手,这里也建议大家先进行工作流及BPMN2.0规范的学习,有了一定的基础后,再着手学习Activiti。
1.3.2. Activiti简介
Activiti是一个开源的工作流引擎,它实现了BPMN 2.0规范,可以发布设计好的流程定义,并通过api进行流程调度。
Activiti 作为一个遵从 Apache 许可的工作流和业务流程管理开源平台,其核心是基于 Java 的超快速、超稳定的 BPMN2.0 流程引擎,强调流程服务的可嵌入性和可扩展性,同时更加强调面向业务人员。
Activiti 流程引擎重点关注在系统开发的易用性和轻量性上。每一项 BPM 业务功能 Activiti 流程引擎都以服务的形式提供给开发人员。通过使用这些服务,开发人员能够构建出功能丰富、轻便且高效的 BPM 应用程序。
1.4. 文档说明
以上部分对工作流、BPMN、Activiti的概念做了一个简单的介绍,目的是了解Activiti究竟是什么,能做些什么…及在学习Activiti之前需要了解的知识与技术。其中大部分文字来自Copy网上的各种资料与文档,通过总结而来的。具体的更详细的内容需自己google,参考一些官方的文档与手册。
本文档之后内容如下:
1)&&&&&&下载与使用
2)&&&&&&核心组件与说明
3)&&&&&&入门示例
4)&&&&&&Eclipse中的Activiti插件的使用
本文档旨在为初学Activiti的朋友提供入门级别的参考,不会对其原理及其结构进行深层次的探究(更多是因为目前自身理解还不是很透彻),只是为大家理清思路,方便以后更深层次的学习。本文档还有一个重要的特点,那就是根据自己看官方手册的经验,教大家如何看手册从而更有效率!由于是初学,很多术语或解释难免理解有偏差,所以一定要看官方提供的文档与手册,那才是学习的最佳途径!
2. 开始学习
2.1. 必要的准备
2.1.1. 下载与了解目录
下载Activiti:下载路径,也就是官方网站的地址:。下载后解压(我所使用的是5.12版本的,Activiti更新速度飞快,几乎每两个月就会有一个更新的小版本),看到如下目录:
1)&&&&&&database:里面存放的是Activiti使用到的数据库信息的sql文件,它支持的数据库类型如下图,使用时只需执行你自己的数据库类型的文件即可。如:你的数据库是mysql,那么就执行activiti.mysql.create.*.sql即可。
2)&&&&&&docs:毫无疑问,api文档是也。
3)&&&&&&libs:使用Activiti所需要的所有的jar包和源文件。
4)&&&&&&wars:官方给我们提供的示例Demo,通过使用Demo可以更加快速的了解Activiti。
2.1.2. 其他准备
使用Activiti,首先当然要有jdk了!6+版本就可以了。其次,要有一款IDE,我们当然会使用Eclipse,这里使用Juno版本。然后,web容器当然也要有,这里使用Tomcat6.0版本。然后就是Activiti的Eclipse插件了,这个后面再介绍。
2.1.3. 一分钟入门(见用户手册)
所谓的一分钟入门就是通过运行你下载的包里的wars文件夹里的activiti-explorer.war文件,以便更快的了解Activiti。将文件拷贝至Tomcat的webapps目录,启动tomcat,输入。然后你就可以开整了!总算是有一点微小的进展了。
这里需要说明的就是,这个Demo默认采用的是h2内存数据库,如果想用你自己的数据库,就需要修改web应用WEB-INF/classes目录下的db.properties。然后,按上面说的,把database里的create文件夹里的数据库文件导入你自己的数据库(如果没有修改db.properties,就不用导入了)。
Demo的具体解释与数据库配置的具体信息详见官方手册,手册已经说的很清楚了。这里需要重点了解activiti.cfg.xml的配置以及如何构建ProcessEngine(配置文件构建方式、代码构建方式)。
对Demo的使用介绍在官方文档的后面才开始介绍,这里建议应用跑起来之后,先自己试试手(可看后面介绍Demo如何使用的章节),看看如何跑一个流程、整个流程是怎么流的、并随时关注数据库表里的数据的变化等,对以后的学习很有帮助!
2.2. 核心组件介绍
2.2.1. 关键对象
1.&&&&&&Deployment:流程部署对象,部署一个流程时创建。
2.&&&&&&ProcessDefinitions:流程定义,部署成功后自动创建。
3.&&&&&&ProcessInstances:流程实例,启动流程时创建。&
4.&&&&&&Task:任务,在Activiti中的Task仅指有角色参与的任务,即定义中的UserTask。&
5.&&&&&&Execution:执行计划,流程实例和流程执行中的所有节点都是Execution,如UserTask、ServiceTask等。
2.2.2. 服务接口
1.&&&&&&ProcessEngine:流程引擎的抽象,通过它我们可以获得我们需要的一切服务。&
2.&&&&&&RepositoryService:Activiti中每一个不同版本的业务流程的定义都需要使用一些定义文件,部署文件和支持数据(例如BPMN2.0 XML文件,表单定义文件,流程定义图像文件等),这些文件都存储在Activiti内建的Repository中。RepositoryService提供了对 repository的存取服务。
3.&&&&&&RuntimeService:在Activiti中,每当一个流程定义被启动一次之后,都会生成一个相应的流程对象实例。RuntimeService提供了启动流程、查询流程实例、设置获取流程实例变量等功能。此外它还提供了对流程部署,流程定义和流程实例的存取服务。
4.&&&&&&TaskService: 在Activiti中业务流程定义中的每一个执行节点被称为一个Task,对流程中的数据存取,状态变更等操作均需要在Task中完成。TaskService提供了对用户Task 和Form相关的操作。它提供了运行时任务查询、领取、完成、删除以及变量设置等功能。&
5.&&&&&&IdentityService: Activiti中内置了用户以及组管理的功能,必须使用这些用户和组的信息才能获取到相应的Task。IdentityService提供了对Activiti 系统中的用户和组的管理功能。
6.&&&&&&ManagementService: ManagementService提供了对Activiti流程引擎的管理和维护功能,这些功能不在工作流驱动的应用程序中使用,主要用于Activiti系统的日常维护。&
7.&&&&&&HistoryService: HistoryService用于获取正在运行或已经完成的流程实例的信息,与RuntimeService中获取的流程信息不同,历史信息包含已经持久化存储的永久信息,并已经被针对查询优化。
现在至少要知道有这些对象和接口。并结合Activiti Api这一章节来看,你就会对部署流程、启动流程、执行任务等操作有一个基本的概念。之后编写一个简单的单元测试,主要为了测试activiti.cfg.xml配置的是否正确,流程是否可以被部署即可。
至于与Spring的集成,一定要熟悉基于Spring配置Activiti,以及事务的处理。
3. 入门示例(参考手册中10分钟教程)
下面开始编写一个示例。这个Demo为一个“月度报表申请”流程。由“sales(销售)”组的用户制作月度报表,提交给“management(经理)”组的用户,经理审批该报表,最后结束。流程图如下:
这个Demo完成之后,我们会进行两个测试。一个是代码中的单元测试,就是跑一遍流程,看一下流程在跑的过程中输出的信息;一个是我们将编辑好的bpmn20.xml文件通过我们之前一分钟入门的示例activiti-explorer应用导入进去,查看它的流程图,并完整执行一遍流程。
在编写这个Demo之前,至少要了解Activiti与Spring如何集成、XxxService各自的任务与作用,并完成上一章的Demo。
3.2. 流程文件xxx.bpmn20.xml
首先,我们就来编写这个流程的bpmn20.xml文件。
&definitions
id=&definitions&
& targetNamespace=&http://activiti.org/bpmn20&
& xmlns:activiti=&http://activiti.org/bpmn&
& xmlns=&http://www.omg.org/spec/BPMN//MODEL&&
& & & & &process id=&financialReport&
name=&Monthly financial report reminderprocess&&
& & & & & &startEvent
id=&theStart&
& & & & & &sequenceFlow
id='flow1'
sourceRef='theStart'
targetRef='writeReportTask'
& & & & & &userTask
id=&writeReportTask&
name=&Write monthly financial report&
& & & & & & &documentation&
& & & & & & & Write monthly financial reportfor publication to shareholders.
& & & & & & &/documentation&
& & & & & & &potentialOwner&
& & & & & & & &resourceAssignmentExpression&
& & & & & & & & &formalExpression&sales&/formalExpression&
& & & & & & & &/resourceAssignmentExpression&
& & & & & & &/potentialOwner&
& & & & & &/userTask&
& & & & & &sequenceFlow
id='flow2'
sourceRef='writeReportTask'
targetRef='verifyReportTask'
& & & & & &userTask
id=&verifyReportTask&
name=&Verify monthly financial report&
& & & & & & &documentation&
& & & & & & & Verify monthly financial reportcomposed by the accountancy department.
& & & & & & & This financial report is goingto be sent to all the company shareholders.
& & & & & & &/documentation&
& & & & & & &potentialOwner&
& & & & & & & &resourceAssignmentExpression&
& & & & & & & & &formalExpression&management&/formalExpression&
& & & & & & & &/resourceAssignmentExpression&
& & & & & & &/potentialOwner&
& & & & & &/userTask&
& & & & & &sequenceFlow
id='flow3'
sourceRef='verifyReportTask'
targetRef='theEnd'
& & & & & &endEvent
id=&theEnd&
& & & & &/process&
&/definitions&
这里对部分代码进行解释。
1)&&&&&& 文件的开头部分,这里的id对于Activiti来说, 应该叫做key。创建流程实例时,会根据此id来得到这个流程。
2)&&&&&&开始流程。
3)&&&&&&顺序流(就是连接各个节点的指向线)
sourceRef和targetRef分别为起始节点和目标节点。
4)&&&&&&描述用户任务
id为该用户任务的标识。
documentation为该用户任务的描述。
5)&&&&&&分配用户
可以把任务分配给指定的用户,也可以分配给指定的组,并且可以有多个,详见用户手册。
3.3. Spring配置文件
这里配置了数据源、事务管理、流程引擎及几个必要的xxxService。这里数据源使用的是dbcp。数据库信息就配置成你自己本地数据库的信息,如果不会配置。
id=&dataSource&
class=&mons.dbcp.BasicDataSource&
&&&&&&&& destroy-method=&close&&
&&&&&&&& &property
name=&driverClassName&
value=&com.mysql.jdbc.Driver&
&&&&&&&& &property
name=&url&
value=&jdbc:mysql://localhost:3306/activiti&/&
&&&&&&&& &property
name=&username&
value=&root&/&
&&&&&&&& &property
name=&password&
value=&root&/&
&&&&&&&& &property
name=&initialSize&
value=&20&
&&&&&&&& &property
name=&maxActive&
value=&50&/&
&&&&&&&& &property
name=&maxIdle&
value=&20&/&
&&&&&&&& &property
name=&minIdle&
value=&10&/&
&&& &/bean&
id=&transactionManager&
&&&&&&&& class=&org.springframework.jdbc.datasource.DataSourceTransactionManager&&
&&&&&&&& &property
name=&dataSource&
ref=&dataSource&&&/property&
&&& &/bean&
id=&processEngineConfiguration&
class=&org.activiti.spring.SpringProcessEngineConfiguration&&
&&&&&&&& &property
name=&dataSource&
ref=&dataSource&
&&&&&&&& &property
name=&transactionManager&
ref=&transactionManager&
&&&&&&&& &property
name=&databaseSchemaUpdate&
value=&true&
&&&&&&&& &property
name=&jobExecutorActivate&
value=&false&
&&& &/bean&
id=&processEngine&
class=&org.activiti.spring.ProcessEngineFactoryBean&&
&&&&&&&& &property
name=&processEngineConfiguration&
ref=&processEngineConfiguration&
&&& &/bean&
id=&repositoryService&
factory-bean=&processEngine&
&&&&&&&& factory-method=&getRepositoryService&
id=&runtimeService&
factory-bean=&processEngine&
&&&&&&&& factory-method=&getRuntimeService&
id=&taskService&
factory-bean=&processEngine&
&&&&&&&& factory-method=&getTaskService&
id=&historyService&
factory-bean=&processEngine&
&&&&&&&& factory-method=&getHistoryService&
id=&managementService&
factory-bean=&processEngine&
&&&&&&&& factory-method=&getManagementService&
&&& &tx:annotation-driven
transaction-manager=&transactionManager&
注:bpmn20.xml文件中用到了两个用户组(sales、management),是因为我们启动Tomcat运行应用初始化时自动就会往数据库里添加一些数据,其中用户组的表中就会添加几条记录,其中就包括这两个组,所以不用管它怎么来的,总之数据库里有这两个组就对了。而应用默认使用的是内存数据库,服务一停止数据也就没有了。所以为了进行单元测试,需要按前面讲的修改数据库配置的方法:
把activiti-explorer应用的数据库配置改成你自己的本地数据库的信息,我使用的是Mysql数据库。再启动tomcat运行应用(目的就是为了让数据库有数据),这时你的本地数据库就有数据了,可以编写测试用例进行单元测试了。
3.4. 编写测试用例
1)&&&&&&读取Spring配置文件,注入流程所需的Service
2)&&&&&&编写测试方法
&&& public
void monthtest() {
&&&&&&& // 部署流程定义
&&&&&&& repositoryService.createDeployment().addClasspathResource(&myProcess.bpmn20.xml&).deploy();
&&&&&&& // 启动流程实例
&&&&&&& String procId = runtimeService.startProcessInstanceByKey(&financialReport&).getId();
&&&&&&& // 获得第一个任务
&&&&&&& List&Task& tasks = taskService.createTaskQuery().taskCandidateGroup(&sales&).list();
&&&&&&& for (Task task : tasks) {
&&&&&&&&&&& System.out.println(&Following task is available for sales group: & + task.getName());
&&&&&&&&&&& // 认领任务这里由foozie认领,因为fozzie是sales组的成员
&&&&&&&&&&& taskService.claim(task.getId(),
&fozzie&);
&&&&&&& // 查看fozzie现在是否能够获取到该任务
&&&&&&& tasks = taskService.createTaskQuery().taskAssignee(&fozzie&).list();
&&&&&&& for (Task task : tasks) {
&&&&&&&&&&& System.out.println(&Task for fozzie: & + task.getName());
&&&&&&& &&&&// 执行(完成)任务
&&&&&&&&&&& taskService.complete(task.getId());
&&&&&&& // 现在fozzie的可执行任务数就为0了
&&&&&&& System.out.println(&Number of tasks for fozzie: &
&&&&&&&&&&&&&&&&&&&&&&&&&& + taskService.createTaskQuery().taskAssignee(&fozzie&).count());
&&&&&&& // 获得第二个任务
&&&&&&& tasks = taskService.createTaskQuery().taskCandidateGroup(&management&).list();
&&&&&&& for (Task task : tasks) {
&&&&&&&&&&& System.out.println(&Following task is available for accountancy group:& + task.getName());
&&&&&&&&&&& // 认领任务这里由kermit认领,因为kermit是management组的成员
&&&&&&&&&&& taskService.claim(task.getId(),
&kermit&);
&&&&&&& // 完成第二个任务结束流程
&&&&&&& for (Task task : tasks) {
&&&&&&&&&&& taskService.complete(task.getId());
&&&&&&& // 核实流程是否结束,输出流程结束时间
&& &&&&&HistoricProcessInstancehistoricProcessInstance =
historyService.createHistoricProcessInstanceQuery()
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&.processInstanceId(procId).singleResult();
&&&&&&& System.out.println(&Process instance end time: & + historicProcessInstance.getEndTime());
3)&&运行示例,Demo完成。这就是一个最简单的流程,通过这个流程,了解到Activiti中流程是怎么流的,我们怎么控制它。
3.5. 导入activiti-explorer
1)&&&&&&单元测试完成后,我们可以将该bpmn20.xml文件导入之前我们部署的activiti-explorer应用中:点击流程的流程设计工作区,点击导入,将刚才我们编写的文件导入进去。
2)&&&&&&导入之后在右上角点击部署。
3)&&&&&&在已部署流程定义中我们可以看到这个流程,及它的流程图。
4)&&&&&&点击启动流程,该流程就会被启动,再点击任务中,列队就会有该任务了,而且是分配给sales的,这正是我们定义流程时所分配给的用户组啊。注意,现在只有sales组的用户才可以看到此任务!
5)&&&&&&sales组的用户进入之后点击“签收”,该任务就分配给该用户了,然后该用户就可以进行处理,也就是在代办任务和受邀里。
6)&&&&&&进去之后点击完成任务,该任务就流到下一个节点,也就是流转到management组中去了,要由management组的用户去处理。
7)&&&&&&于是这时候,队列中management组就有一个新的任务了,等待management组的成员来“签收”,并完成任务。该流程也就结束了。
8)&&&&&&此时就可以查看历史任务了,就是我们这里的“已归档”。用户完成的任务会在这里显示。
这就是整个Demo的编写、测试过程。这样一个小小的流程基本能够体现出Activiti的功能及使用方法。
4. Eclipse中的Activiti插件
Activiti有一个Eclipse插件,Activiti Eclipse Designer,可用于图形化建模、测试、部署 BPMN 2.0的流程。这样就不用我们自己去编写繁琐的流程文件了。具体安装方法见手册。
打开&Help-& Install New Software.在如下面板中 , 点击&Add&按钮, 然后填入下列字段:
Name:&Activiti BPMN 2.0 designer
Location:&
然后一步步的安装就可以了。
至于如何使用,文档中介绍的非常详细,这里基于我初次使用的经验,强调几点:
1)&&&&&&安装之后将“保存bpmn文件时创建图片文件”勾选上。这样你每次保存bpmn文件时,会为你自动创建图片文件。
2)&&&&&&节点的所有属性可在properties控制台中设置。
3)&&&&&&在使用设计器之前,先去钻研BPNM2.0规范吧,了解BPNM结构(可参看用户手册),才能画出符合逻辑且完美的流程图。
该例为使用Activiti Eclipse Designer设计的“请假”流程图。
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:351523次
积分:5919
积分:5919
排名:第1940名
原创:138篇
转载:137篇
评论:1078条
中国科学院博士,5年Visual C++开发经验,15年Java Web开发经验,5年20+人团队管理经验。著有图书《标准C++开发入门与编程实践》、《把脉VC++》,以及“白乔原创”系列技术文章多篇。
开源贡献,欢迎star:
QQ:5854165

我要回帖

更多关于 流程节点 的文章

 

随机推荐