FixFlow6.0版本开始改名为FoxBPM,该版本添加了一个对客户和开发人员来说都很实用的功能:流程运行轨迹。站在开发人员的角度流程运行轨迹可用于调试跟踪相对复杂的流程,站在客户的角度对流程监控分析提供动态支持。运行轨迹基于流程引擎的全局事件监听机制,其原理是针对每个节点的进入事件添加一个负责记录节点信息的监听器,当流程启动运行进入节点的时候,会产生一个进入事件并且触发该事件所有的监听器,这样就可以拿到流程运行的时候每个节点的进入执行信息了。
代码实现:
1、需要一个记录监听器。
2、通过配置文件对监听器进行配置,在流程模型转化的时候将监听器装入流程定义。
3、针对记录信息需要一个纵向的可查询的持久化功能。
4、数据库表、实体类。
5、展示记录信息的平台(目前支持SVG格式的流程定义图形)。
以下为部分核心实现代码、首先是实现KernelListener接口的监听定义类
public abstract class AbstractTrackListener implements KernelListener { private static long tractRecord = 0; /** * serialVersionUID:序列化 */ private static final long serialVersionUID = 6870039432248742401L; private SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddhhmmssSSS"); @Override public void notify(ListenerExecutionContext executionContext) throws Exception { // 记录流程实例的运行轨迹 this.recordOperate(executionContext); // TODO 用户定制其他的监听操作 // otherOperate(executionContext); } /** * recordOperate(记录流程实例的运行轨迹) * * @param executionContext * void */ private void recordOperate(ListenerExecutionContext executionContext) { // 记录流程实例的运行轨迹 RunningTrackEntity runningTrackEntity = this.recordRunningTrack(executionContext); if (runningTrackEntity == null) { throw new FoxBPMException("分类构造的运行轨迹实体 不能为空"); } if (tractRecord == 0) { tractRecord = Long.parseLong(sdf.format(new Date())); } KernelTokenImpl kernelTokenImpl = (KernelTokenImpl) executionContext; KernelProcessDefinitionImpl processDefinition = kernelTokenImpl.getProcessDefinition(); runningTrackEntity.setId(GuidUtil.CreateGuid()); runningTrackEntity.setProcessDefinitionId(processDefinition.getId()); runningTrackEntity.setProcessDefinitionKey(processDefinition.getKey()); runningTrackEntity.setTrackRecord(String.valueOf(tractRecord)); runningTrackEntity.setExecutionTime(new Date()); runningTrackEntity.setEventName(kernelTokenImpl.getEventName()); runningTrackEntity.setTokenId(kernelTokenImpl.getId()); runningTrackEntity.setParentTokenId(kernelTokenImpl.getParent() == null ? "" : kernelTokenImpl.getParent().getId()); runningTrackEntity.setProcessInstanceId(kernelTokenImpl.getProcessInstanceId()); // 增加运行轨迹、保存数据 tractRecord = tractRecord + 1; this.saveRunningTrackEntity(runningTrackEntity); } /** * * saveRunningTrackEntity 保存数据 * * @param runningTrackEntity * @since 1.0.0 */ private void saveRunningTrackEntity(RunningTrackEntity runningTrackEntity) { Context.getCommandContext().getRunningTrackManager().insert(runningTrackEntity); } /** * * recordRunningTrack(记录操作人、节点信息等特定轨迹信息) * * @param executionContext * @return RunningTrackEntity */ protected abstract RunningTrackEntity recordRunningTrack( ListenerExecutionContext executionContext); }
以下是监听器的配置和注册代码
配置、foxbpm.cfg.xml:
<eventListenerConfig> <!-- <eventListener eventType="process-start" listenerClass="org.foxbpm.engine.impl.listener.runningtrack.StartEventTrackListener" /> --> <eventListener eventType="node-enter" listenerClass="org.foxbpm.engine.impl.listener.runningtrack.FlowNodeTrackListener" /> <!-- <eventListener eventType="node-execute" listenerClass="org.foxbpm.engine.impl.listener.runningtrack.FlowNodeTrackListener" /> <eventListener eventType="node-leave" listenerClass="org.foxbpm.engine.impl.listener.runningtrack.FlowNodeTrackListener" /> --> <eventListener eventType="sequenceflow-take" listenerClass="org.foxbpm.engine.impl.listener.runningtrack.SequenceTrackEventListener" /> <eventListener eventType="process-start" listenerClass="org.foxbpm.engine.impl.listener.task.StartEventTaskListener" /> <eventListener eventType="process-end" listenerClass="org.foxbpm.engine.impl.listener.task.EndEventTaskListener" /> </eventListenerConfig>
注册、BpmnParseHandlerImpl.java:
/** * 加载配置监听器、 独立加载 和嵌入流程定义创建代码中,算法效率是一样的 监听器集合SIZE * 节点集合SIZE * 不建议侵入到流程定义的LOAD代码中 * * @param processEntity */ private void registListener(ProcessDefinitionEntity processEntity) { EventListenerConfig eventListenerConfig = Context.getProcessEngineConfiguration().getFoxBpmConfig().getEventListenerConfig(); if (eventListenerConfig != null) { // 加载监听器 List<EventListener> eventListenerList = eventListenerConfig.getEventListener(); KernelListener foxbpmEventListener = null; try { for (EventListener eventListener : eventListenerList) { foxbpmEventListener = (KernelListener) Class.forName(eventListener.getListenerClass()).newInstance(); if (StringUtil.equals(eventListener.getEventType(), KernelEventType.EVENTTYPE_PROCESS_START) || StringUtil.equals(eventListener.getEventType(), KernelEventType.EVENTTYPE_PROCESS_END)) { // 注册启动监听 processEntity.addKernelListener(eventListener.getEventType(), foxbpmEventListener); } else { if (StringUtil.equals(eventListener.getEventType(), KernelEventType.EVENTTYPE_SEQUENCEFLOW_TAKE)) { // 注册线条监听 Map<String, KernelSequenceFlowImpl> sequenceFlows = processEntity.getSequenceFlows(); Set<Entry<String, KernelSequenceFlowImpl>> sequenceEntrySet = sequenceFlows.entrySet(); Iterator<Entry<String, KernelSequenceFlowImpl>> sequenceEntryIter = sequenceEntrySet.iterator(); Entry<String, KernelSequenceFlowImpl> sequenceFlow = null; KernelSequenceFlowImpl kernelSequenceFlowImpl = null; while (sequenceEntryIter.hasNext()) { sequenceFlow = sequenceEntryIter.next(); kernelSequenceFlowImpl = sequenceFlow.getValue(); kernelSequenceFlowImpl.addKernelListener(foxbpmEventListener); } } else { // 注册节点监听 List<KernelFlowNodeImpl> flowNodes = processEntity.getFlowNodes(); this.registerFlowNodeListener(flowNodes, eventListener, foxbpmEventListener); } } } } catch (Exception e) { throw new FoxBPMException("加载运行轨迹监听器时出现问题", e); } } }
相关推荐
- 同时,FoxBPM提供了一系列工具,如流程设计器、监控工具等,帮助用户创建、部署和监控流程实例,确保流程运行顺畅。 5. **实际应用场景** - 在企业实际运营中,FoxBPM连接器可广泛应用于各种业务流程,如采购...
FoxBPM(6.0版本开始fixflow改名为FoxBPM)是一款开源的基于BPMN2.0标准的工作流引擎,引擎底层直接支持BPMN2.0国际标准, 吸纳了 jBPM3 、 Activiti5、BonitaBPM 等国际开源流程引擎的精髓, 同时提供了强大的中国式流程...
FoxBPM-Designer FoxBPM流程设计器 #分支介绍 develop 最新开发版 master 最新稳定版 release-* 发布分支为准备新的产品版本发布做支持 hotfix-* 当产品版本的重大bug需要立即解决的时候,我们从对应版本的标签创建...
内容概要:本文档介绍了航空公司的业务分析案例研究,涵盖两个主要部分:a) 使用SSIS进行数据转换,b) 利用RapidMiner进行预测分析。这两个任务旨在通过改善客户满意度来优化业务运营。数据来源包括多个CSV文件,如flight_1.csv、flight_2.csv、type.csv、customer.csv 和 address.csv。第一部分要求学生创建事实表、客户维度表和时间维度表,并描述整个数据转换流程。第二部分则需要利用RapidMiner开发两种不同的模型(如决策树和逻辑回归)来预测客户满意度,并完成详细的报告,其中包括执行摘要、预测分析过程、重要变量解释、分类结果、改进建议和伦理问题讨论。 适合人群:适用于对数据科学和商业分析有一定基础的学生或专业人士。 使用场景及目标:本案例研究用于教学和评估,帮助学员掌握数据转换和预测建模的技术方法,提高客户满意度和业务绩效。目标是通过实际操作加深对相关工具和技术的理解,并能够将其应用于实际业务中。 其他说明:此作业占总评的40%,截止时间为2024年10月25日16:00。
一、课题介绍 现在我国尤其是北方城市,工业发达,废弃排放严重,这使得雾霾越来越厉害,让能见度极低。这严重影响了我们的交通系统,导航系统,卫星定位系统等,给人民出行,工作带来极大的不便利。目前市场上高清拍摄设备虽然可以让成像清晰点,但是造价高昂。如果有一套软件处理系统,可以实时地处理含雾的图像,让成像去雾化,让图像变得清晰,将会很受欢迎。 该课题是基于MATLAB平台的图像去雾处理,配备一个人机交互GUI界面,可以选择全局直方图均衡化,Retinex算法,同态滤波,通过对比处理前后的图像的直方图,而直方图是一副图像各灰度值在0-256的分布个数的表,信息论已经整明,具有均匀分布直方图的图像,其信息量是最大的。 二、算法介绍 ①全局直方图均衡化:通俗地理解就是,不管三七二十一,直接强行对彩色图像的R,G,B三通道颜色进行histeq均衡处理,然后进行三通道重组; ②Retinex算法:通俗地讲就是,分离R,G,B三通道,对每个通道进行卷积滤波。
微信支付V2版本的支付接口,java的SDK
一款IDEA好用的插件,适用于旗舰版,可以延长试用期限,你懂的!
内容概要:本文详细介绍了发电机组保护整定方法,讨论了发电机可能遇到的故障状态及相应的保护措施,包括定子绕组故障、转子绕组故障、过电流、过电压等情况,并提供了具体的保护配置。接着,对变压器常见故障进行了分类说明,并给出变压器的主保护和后备保护配置方案。文章进一步计算了不同短路点的短路电流,阐述了互感器的选择标准,并举例解释了纵联保护的应用和后备保护的作用。 适合人群:电力系统工程师、继电保护技术人员及相关研究领域的学者。 使用场景及目标:适用于发电厂和变电站的设计、维护和运行人员,旨在提高电力系统的安全性和稳定性。目标是确保电力系统关键设备的安全运行,防止故障的发生,减少事故造成的损失。 其他说明:本文不仅提供了详细的理论分析,还包括了大量的数据计算和实例说明,有助于读者更好地理解和掌握继电保护的相关知识和技术。
基于C++开发的微商系统项目源码 使用技术:C++/Qt、Mysql、TCP/IP 软件架构 三个大端:服务端、客户端(买家端)、业务端(卖家端) PS:需要连Mysql数据库才能正常使用,连接mysql时记得把用户、密码啥的改为自己的数据库信息
1503ANDH1503002016_20241116222825
数理逻辑近世代数复习资料,思维导图部分
京东中台业务架构敏捷性方法 MotriDSP 落地实践.pdf
该资源内项目源码是个人的课程设计、毕业设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过严格测试运行成功才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。
CCF会员复习资料(1).zip
ASP.NET养老院老人信息管理系统源码 这是一款非常优秀的养老院老人信息管理系统。程序功能齐全,可选择性强。 管理员后台: 1、人员信息管理:老人信息管理、管理员信息管理、员工信息管理 2、公寓信息管理:添加公寓楼信息、管理公寓楼信息、添加公寓信息、管理公寓信息 3、公寓安排管理:添加公寓安排、公寓安排管理、缴费管理 4、健康管理信息管理:添加健康管理信息、管理健康管理信息 5、紧急联络人管理 6、意见信息管理 7、公告信息管理:添加公告信息、管理公告信息 8、出入信息管理:请假信息管理、访客记录管理、退住情况 员工后台: 1、人员信息管理:老人信息管理 2、健康管理信息管理:管理健康管理信息 3、紧急联络人管理 4、意见信息管理 5、公告信息管理:管理公告信息 6、出入信息管理:请假信息管理、访客记录管理、退住情况 老人后台: 1、修改个人信息 2、修改登陆密码 3、意见信息管理:发布意见信息、意见信息管理 4、查看公告信息
走向现代化数据分析架构:趋势与挑战.pdf
PHP通用权限管理系统源码 安装说明: 1.把管理系统.sql 导入到MYSQL数据库中,把App/Common/Conf/db.php中的数据库名称,账号密码改成自己的。 2.把程序放在二级目录下,如:http://localhost/xcrm/ 账号 admin 密码admin123 3.请使用IE8以上,或是谷歌浏览器。 4.支持环境php+apache,php版本要大于5.3 注意:删除App下面 Runtime 文件夹;如果Linux服务器,需要分配777权限; 修改config.php数据库连接地址:绝对路径 大家在安装的时候遇到问题 1.页面顶部出现空白一行 解决办法:db.php 要以uft8无BOM格式编码 保存 notepad++ 编辑器里 格式 下 2.乱码问题 解决办法:数据库建表的时候选 uft8-general-ci 编码格式 然后点开 SQL 把1,SQL复制进去,执行就可以了 3、如果程序执行时报错? 解决办法:保存PHP>5.3版本 删除App下面 Runtime 文件夹 使用须知:注释:权限管理,修改完用户所属组之后,
详细介绍及样例数据:https://blog.csdn.net/m0_65541699/article/details/143823092
席卡制作模版会议较多的单位,经常要打印席卡,本模版可以解决燃眉之急
从 0 到 1 构建集群服务质量运营体系降低云成本.pdf