jBPM4.0的用户指南(四)

jBPM流程引擎实践
本文介绍了jBPM流程引擎的使用方法,包括流程引擎的配置、流程部署、启动流程实例及任务管理等内容。读者将了解到如何通过不同方式启动流程实例,并掌握执行等待流程的方法。
[size=x-large] 第 4 章 服务[/size]

jBPM和服务相互影响,配置成功之后就可以从流程引擎里获得服务接口。
[size=large]4.1. 流程引擎[/size]

流程引擎是线程安全的,它可以保存在静态变量中,甚至JNDI中或者其他重要位置。在应用中,所有线程和请求都可以使用同一个流程引擎对象,现在就告诉你怎么获得流程引擎。

ProcessEngine processEngine = new Configuration()
.buildProcessEngine();


上面的代码演示了如何通过classpath根目录下默认的配置文件jbpm.cfg.xml创建一个ProcessService。如果你要指定其他位置的配置文件,请使用setResource()方法:

ProcessEngine processEngine = new Configuration()
.setResource("my-own-configuration-file.xml")
.buildProcessEngine();


还有其他setXxxx()方法可以获得配置内容,例如:从InputStream中、从xml字符串中、从InputSource中、从URL中或者从文件(File)中。

我们可以根据流程引擎得到下面的服务:

ProcessService processService = processEngine.getProcessService()
ExecutionService executionService = processEngine.getExecutionService();
ManagementService managementService = processEngine.getManagementService();
TaskService taskService = processEngine.getTaskService();


在配置中定义的这些流程引擎(ProcessEngine)对象,也可以根据类型processEngine.get(Class<T>)或者根据名字processEngine.get(String)来获得。
[size=large]4.2. 部署流程[/size]

ProcessService中包含了所有可以得到流程定义资源的方法。

比如在classpath的资源中的jPDL流程文件order.jpdl.xml,可以使用ProcessService进行部署。如下:

processService.createDeployment()
.addResource("order.jpdl.xml").deploy();


像上面的addResource方法,XML流程定义文件的来源可以是一个文件、url网址、字符串、inputStream、zip或jar压缩包和一个目录。

部署的来源中包含了满足默认命名规范的资源文件,它可能包含各种流程描述和自定义类型。jPDL的部署工具会自动识别后缀名是.jpdl.xml的流程文件。对于那些没有按照规范进行命名的文件,可以使用jpdl提供的方法进行编程设置。

setFileType("my-jpdl-process.someotherextension", "jpdl")

在部署的过程中,流程定义会被分配一个格式为{key}:{version}的id

如果没有提供key,会在名字的基础自动生成。生成的key会替换所有不是字母和数字的字符。

同一个名字关联一个key,反之亦然。

如果没有为流程文件提供版本号,jBPM会自动为它分配一个版本号。请特别注意那些已经部署了的名字相同的流程文件的版本号。它会比已经部署的同一个key的流程定义里最大的版本号还大。没有部署相同key的流程定义的版本号会分配为1,

在下面第1个例子里,我们只提供了流程的名字,没有提供其他信息:

<process nam="Insurance claim">
...
</process>


假设这个流程是第一次部署,下面就是它的属性:

[size=large]表 4.1. 没有key值的属性流程[/size]
Property Value Source
name Insurance claim process xml
key Insurance_claim generated
version 1 generated
id Insurance_claim:1 generated

第2个例子我们将演示如何通过设置流程的key来获得更短的id。

<process name="Insurance claim" key="ICL">
...
</process>


这个流程定义的属性就会像下面这样:

[size=medium]表 4.2. 有key值属性的流程[/size]
Property Value Source
name Insurance claim process xml
key ICL process xml
version 1 generated
id ICL:1 generated

[size=large]4.3. 启动一个新的流程实例[/size]
[size=medium]4.3.1. 最新的流程实例[/size]

下面是为流程定义启动一个新的流程实例的最简单也是最常用的方法:

executionService.startProcessInstanceByKey("ICL");


上面的service的方法会去查找key为ICL的最新版本的流程定义,然后在流程定义里启动流程实例。

当insurance claim流程部署了一个新版本,startProcessInstanceByKey方法会自动去选择最新部署的版本。[size=medium]
4.3.2. 明确流程版本[/size]

换句话说,你如果想根据明确的版本启动流程实例,便可以使用流程定义的id启动流程实例。如下所示:

executionService.startProcessInstanceById("ICL:1");


[size=large]4.3.3. 使用锁[/size]

我们可以为新启动的流程实例分配一个key,key是用户执行的时候定义的。一个流程定义里的所有key必须都是唯一的。在企业的流程里很容易在领域模型里找到唯一的key。例如:序列号或保险编号。

executionService.startProcessInstanceByKey("ICL", "CL92837");


key可以用来创建流程实例的id,格式为{process-key}/{execution-id}。所以上面的代码会创建一个id为ICL/CL92837的流向(execution)。

如果没有提供用户定义的key,数据库就会把主键作为key。这样可以使用如下方式获得id:

Execution execution = executionService.startProcessInstanceByKey("ICL");
String executionId = execution.getId();


我们推荐使用用户定义的key,特别是在你的应用代码里,你可以得到有效的key。根据用户定义的key,你可以直接使用流向的id,而不用根据流程的变量进行查询。
[size=large]4.3.4. 使用变量[/size]

当一个新的流程实例启动时就会提供一组对象参数。将这些参数放在variables变量里,然后可以在流程实例创建和启动时使用。

Map<String,Object> varialbes = new HashMap<String,Object>();
variables.put("customer","John Doe");
variables.put("type","Accident");
variables.put("amoutn","new Float(763.74)");

executionService.startProcessInstanceByKey("ICL",variables);


[size=large]4.4. 执行等待的流向(execution)[/size]

流程处理定义中必须执行一些活动(activity)。流程处理的任何一个活动(activity)都可能是被流程系统执行或者被外部参与者执行。当一个活动(activity)是被外部参与者执行时,流向必须等待外部参与者通知流程系统活动(activity)已经完成。因此流向要么是在执行,要么实在等待外部参与者。你会发现大部分的流程的都在等待外部参与者,因为人的动作都是很慢的。:)两个等待状态之间,被流程系统消耗的时间通常都是很短的。

状态(state)是一种基本活动(activity),它告知外部参与者有哪些事情必须执行,流向会一直等待到signal(外部强制执行)。

当流向处在等待状态时,可以被外部触发器通过signal方法强制执行。我们建议你使用流程定义和流向key来获得一个流向(execution)。在下面的代码中,ICL流程定义的82436流向key被使用了。

executionService.signalExecutionByKey("ICL","82436");


我们还可以这样使用,这个必须执行signal的流向可以通过一个唯一的id被引用,下面的代码中指定了executionId为ICL/82436流向:

executionSerivice.signalExecutionById("ICL/82436");


一些数据可以通过signal传递给系统:信号名和参数。信号名会根据流向(execution)的当前活动(activity)被使用。参数存储在流程的变量里。

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

parameters.put("quality","a+");
parameters.put("target","profit");

executionService.signalExecutionById("ICL/82436","Accept",parameters);

[size=large]
4.5. 任务服务[/size]
[size=large]4.6. 管理服务[/size]
基于51单片机,实现对直流电机的调速、测速以及正反转控制。项目包含完整的仿真文件、源程序、原理图和PCB设计文件,适合学习和实践51单片机在电机控制方面的应用。 功能特点 调速控制:通过按键调整PWM占空比,实现电机的速度调节。 测速功能:采用霍尔传感器非接触式测速,实时显示电机转速。 正反转控制:通过按键切换电机的正转和反转状态。 LCD显示:使用LCD1602液晶显示屏,显示当前的转速和PWM占空比。 硬件组成 主控制器:STC89C51/52单片机(与AT89S51/52、AT89C51/52通用)。 测速传感器:霍尔传感器,用于非接触式测速。 显示模块:LCD1602液晶显示屏,显示转速和占空比。 电机驱动:采用双H桥电路,控制电机的正反转和调速。 软件设计 编程语言:C语言。 开发环境:Keil uVision。 仿真工具:Proteus。 使用说明 液晶屏显示: 第一行显示电机转速(单位:转/分)。 第二行显示PWM占空比(0~100%)。 按键功能: 1键:加速键,短按占空比加1,长按连续加。 2键:减速键,短按占空比减1,长按连续减。 3键:反转切换键,按下后电机反转。 4键:正转切换键,按下后电机正转。 5键:开始暂停键,按一下开始,再按一下暂停。 注意事项 磁铁和霍尔元件的距离应保持在2mm左右,过近可能会在电机转动时碰到霍尔元件,过远则可能导致霍尔元件无法检测到磁铁。 资源文件 仿真文件:Proteus仿真文件,用于模拟电机控制系统的运行。 源程序:Keil uVision项目文件,包含完整的C语言源代码。 原理图:电路设计原理图,详细展示了各模块的连接方式。 PCB设计:PCB布局文件,可用于实际电路板的制作。
旋翼无人机】具备螺旋桨倾斜机构的全驱动旋翼无人机:建模与控制研究(Matlab代码、Simulink仿真实现)内容概要:本文围绕具备螺旋桨倾斜机构的全驱动旋翼无人机展开研究,重点进行了系统建模与控制策略的设计与仿真验证。通过引入螺旋桨倾斜机构,该无人机能够实现全向力矢量控制,从而具备更强的姿态调节能力和六自由度全驱动特性,克服传统旋翼欠驱动限制。研究内容涵盖动力学建模、控制系统设计(如PID、MPC等)、Matlab/Simulink环境下的仿真验证,并可能涉及轨迹跟踪、抗干扰能力及稳定性分析,旨在提升无人机在复杂环境下的机动性与控制精度。; 适合人群:具备一定控制理论基础和Matlab/Simulink仿真能力的研究生、科研人员及从事无人机系统开发的工程师,尤其适合研究先进无人机控制算法的技术人员。; 使用场景及目标:①深入理解全驱动旋翼无人机的动力学建模方法;②掌握基于Matlab/Simulink的无人机控制系统设计与仿真流程;③复现硕士论文级别的研究成果,为科研项目或学术论文提供技术支持与参考。; 阅读建议:建议结合提供的Matlab代码与Simulink模型进行实践操作,重点关注建模推导过程与控制器参数调优,同时可扩展研究不同控制算法的性能对比,以深化对全驱动系统控制机制的理解。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值