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需要立即解决的时候,我们从对应版本的标签创建...
2023-04-06-项目笔记-第二百六十一阶段-课前小分享_小分享1.坚持提交gitee 小分享2.作业中提交代码 小分享3.写代码注意代码风格 4.3.1变量的使用 4.4变量的作用域与生命周期 4.4.1局部变量的作用域 4.4.2全局变量的作用域 4.4.2.1全局变量的作用域_1 4.4.2.259局变量的作用域_259- 2024-09-19
项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(如有)等。答辩评审平均分达到96分,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随时与我联系,我会及时解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后请首先打开README文件(如有),项目工程可直接复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用。
本文阐述了人工智能在数据中心节能应用领域的理论与实践,通过介绍机器学习和基于物理机理模型的人工智能节能技术的应用情况,展示了如何利用AI技术来提升数据中心能源效率,减少PUE。并指出基于大数据分析的智能运维方法能优化数据中心冷却系统的运行状态,从而达成绿色节能目的;同时也强调了未来的节能系统发展趋势及标准化推进措施等重要方向。 适用人群:数据中心管理人员,环保工作者,信息和通信技术行业的专业人士。 使用场景及目标:适用于那些希望利用AI和其他技术优化其数据中心效能的企业;通过技术手段达到减少能耗、提升工作效率的目的。 其他:随着全球对环境友好技术的关注增加,在数据中心的建设和运维过程中融合AI等新技术已经成为必然趋势。
基于java的网上球鞋竞拍系统设计与实现.docx
【c语言入门】 静态库、动态链接库、include、makefile、io、文件操作函数、管道原理及应用、简单的数据结构
基于java中药分类管理系统设计与实现.docx
内容概要:文中针对大斜视SAR系统在动目标成像上遇到的各种问题,包括聚焦难、几何变形和交叉副瓣高等挑战,采用了一个融合了频谱旋转和稀疏化增强处理方式的新颖算法——频谱旋转ωk算法,进行了详细讨论并提供了一套完整解决方案。 适用人群:该研究对于SAR技术研究专家、学者、工程师有着特别的实际意义与价值。 使用场景及目标:本成果可应用于斜视角达到甚至超过七十度的高斜度SAR动目标成像系统中,提升动目标检测、定位、识别等能力。具体应用场景涵盖了战场态势监测、交通流量监管等多个领域。 本文通过详细的理论建模及仿真实验结果论证算法的有效可行性;此外,文中提及了未来在更高动态环境下SAR成像领域的扩展可能性。
基于java的新闻发布系统设计与实现.docx
基于java的应急资源管理系统设计与实现.docx
基于java的斗车交易系统设计与实现.docx
主要内容:文章探讨了随着6G通讯技术发展,将通感一体化应用于车联网的可能性及其带来的显著效果,尤其是在辅助自动驾驶、多车合作感知与控制、车路通感融合发展中的应用。通过阐述各方面的技术框架和细节(如波束管理和智能反射面技术),文中指出了车联网系统在实现高效率、安全性以及智能化管理上的关键突破。同时强调在实施中遇到诸如频带分配、信号混迭、硬件整合等现实挑战,并提出了未来发展方向。 适用人群:研究人员和开发人员,特别是从事车联网和新一代通讯技术支持的专业人士。 使用场景及目标:适用于车联网的研究和开发,目的是构建高效的交通通信系统,在实际使用中促进自动驾驶、智能交通管理系统等新技术落地,提高道路通行的安全性和效率。 相关背景与建议:本文对通感一体化的技术介绍深入浅出,并讨论了一系列技术前沿,包括智能反射技术的最新成果。阅读者应掌握一定的无线通讯基础知识,并能理解技术理论在工程实践里的潜在机遇与难题。
均包含代码,文章,部分项目包含ppt
均包含代码,文章,部分项目包含ppt
2019李宁跑步自媒体年度内容运营方案.pptx
基于java的中国咖啡文化宣传网站的设计与实现.docx
基于java的学生考勤管理设计与实现.docx
安卓开发:探索移动应用的无限可能