`

foxbpm运行轨迹实现

 
阅读更多

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连接器介绍

    - 同时,FoxBPM提供了一系列工具,如流程设计器、监控工具等,帮助用户创建、部署和监控流程实例,确保流程运行顺畅。 5. **实际应用场景** - 在企业实际运营中,FoxBPM连接器可广泛应用于各种业务流程,如采购...

    foxBPM入门项目

    FoxBPM(6.0版本开始fixflow改名为FoxBPM)是一款开源的基于BPMN2.0标准的工作流引擎,引擎底层直接支持BPMN2.0国际标准, 吸纳了 jBPM3 、 Activiti5、BonitaBPM 等国际开源流程引擎的精髓, 同时提供了强大的中国式流程...

    FoxBPM-Designer:FoxBPM流程设计器

    FoxBPM-Designer FoxBPM流程设计器 #分支介绍 develop 最新开发版 master 最新稳定版 release-* 发布分支为准备新的产品版本发布做支持 hotfix-* 当产品版本的重大bug需要立即解决的时候,我们从对应版本的标签创建...

    基于java的技术大健康综合咨询问诊平台的设计与实现.docx

    基于java的技术大健康综合咨询问诊平台的设计与实现.docx

    #_ssm_121_mysql_酒店管理系统_.zip

    均包含代码,文章,部分项目包含ppt

    #_ssm_099_mysql_花卉养殖知识平台_.zip

    均包含代码,文章,部分项目包含ppt

    HTML+CSS实现一个好看的动态交互效果底部导航栏源码

    演示地址:https://blog.csdn.net/qq_41221596/article/details/142372140

    电子卫浴,基于8266,云智易,远程控制浴缸、光波房、温蒸房的工作状态 Android版.zip(毕设&课设&实训&大作业&竞赛

    项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(如有)等。答辩评审平均分达到96分,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随时与我联系,我会及时解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后请首先打开README文件(如有),项目工程可直接复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用

    基于java留学生交流互动论坛网站设计与实现.docx

    基于java留学生交流互动论坛网站设计与实现.docx

    软件自动定时启动器-添加可执行文件软件,设置启动的时间,也可以设置关闭的时间-供大家学习研究参考

    点击添加软件,可以添加可执行文件软件,设置启动的时间,也可以设置关闭的时间 注意,时间为00:00:00 等于没设置,这个时间不在设置范围,其他任何时间都可以 1.1更新 1:修复,设置的软件启动时间无法保存到配置文件 2:修复,设置的软件启动时间软件启动自动加载 3:修复,设置跨天,可能出现,无法执行的问题。

    92092092092011111111111111111

    92092092092011111111111111111

    java-ssm+vue小雨杂志在线投稿网站实现源码(项目源码-说明文档)

    本系统的集成开发环境是Eclipse,前端使用了html+JavaScript等技术,数据库管理运用了MySQL,Web服务器采用Tomcat,另外还采用SSM框架技术和B/S结构。 系统功能实现是系统编码环节,本系统主要分为三个模板,用户管理模块、稿件信息管理模块、留言管理管理模块 项目关键技术 开发工具:IDEA 、Eclipse 编程语言: Java 数据库: MySQL5.7+ 后端技术:ssm 前端技术:Vue 关键技术:springboot、SSM、vue、MYSQL、MAVEN 数据库工具:Navicat、SQLyog

    基于java的旅游资源网站设计与实现.docx

    基于java的旅游资源网站设计与实现.docx

    基于java的高校教师科研信息展示网站设计与实现.docx

    基于java的高校教师科研信息展示网站设计与实现.docx

    计算机二级计算机网络基本概念重点内容自行整理

    计算机网络是现代信息社会的重要基础设施,它通过各种通信设备和协议将不同地理位置的计算机连接起来,实现信息的传输、共享和处理。 计算机网络是指利用通信设备和线路将地理位置不同的、功能独立的多个计算机系统互连起来,以功能完善的网络软件(网络通信协议、信息交换方式及网络操作系统等)实现网络中资源共享和信息传递的系统。

    ASP基于web的学校新闻发布系统开发(论文+源代码+开题报告+文献综述+外文翻译).zip

    1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。

    2015 APMCM B题

    2015 APMCM B题

    基于java的手办周边商城设计与实现.docx

    基于java的手办周边商城设计与实现.docx

    asp.net多线程的TCP端口扫描程序的设计与实现(源代码+论文).zip

    1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看REaDME.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 、1资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。

    POI产品介绍.pptx

    POI产品介绍.pptx

Global site tag (gtag.js) - Google Analytics