flowable 集成mongodb

学无止境,活到老学到老,每天都问自己进步了吗?

1.背景
由于公司每天有至少1500个表单发起,处理待办任务至少7000个,累计历史任务数据已经达到200多w条,时间一长,通过数据库查询已办的任何和我发起的流程巨慢

所以我们考虑到这些数据能不能放入ES或者是mongodb中

流程中心1.0版本集成的是ES,速度确实非常快,提升查询性能近万倍,但是由于ES是一个全文检索的系统,对我们这些业务数据来说,不是很适合,比方说

我们的表单数据,他直接给分词了,不符合业务的要求。

流程中心2.0版本我们就改成mongodb,速度一样达到es的查询效果,解决了以前分词的问题,而且数据结构化查询也非常方便。

2.集成mongodb策略
集成mongodb的策略有两种

2.1.利用flowable提供的mongodb的插件来集成,具体可以参考他们提供的demo
2.2通过流程实例id和任务id查询表数据,做加工处理,然后在通过消息队列的方式同步到mongodb中
第一种方式就相当于把历史表的数据全部搬到mongodb中,在关系型数据库中不存放任何历史数据,正是由于中原因,我担心历史数据的丢失,所以我采用的是

第二种策略,关系数据库中有一份数据,在mongodb中我也有一份加工后的数据,以保证万无一失。

3.具体实现
3.1 同步数据

@Component
@RabbitListener(queues = FlowConstant.FLOWABLE_HISTORY_DATAS, containerFactory = "rabbitListenerContainerFactory")
public class HisDataSyncReceiver {private static Logger logger = LoggerFactory.getLogger(HisDataSyncReceiver.class);@Autowiredprivate ISyncHisService syncHisService;@RabbitHandlerpublic void process(@Payload String message) {if (StringUtils.isNotBlank(message)) {logger.info("接受到的数据为:" + message);try {Thread.sleep(100);SynHisDataVo data = (SynHisDataVo) JsonUtils.jsonToObj(message, SynHisDataVo.class);String type = data.getType();String id = data.getId();String processStaus = data.getProcessStatus();if (type.equals(SynHisDataEnum.EXECUTION.getSn())) {syncHisService.syncExecution(id,processStaus);} else if (type.equals(SynHisDataEnum.TASK.getSn())) {syncHisService.syncTask(id,processStaus);} else {logger.error("历史队列中错误的数据" + message, message);}} catch (Exception e) {logger.error("历史队列中错误的数据"+ message, e);}}}
}

3.2 查询mongodb的任务数据

public PagerModel<SearchTaskVo> querySearchTaskVoPagerModel(QueryTaskVo params, Query query) {org.springframework.data.mongodb.core.query.Query queryParams = new org.springframework.data.mongodb.core.query.Query();queryParams.addCriteria(Criteria.where("endTime").exists(true));if (StringUtils.isNotBlank(params.getAssignee())) {queryParams.addCriteria(Criteria.where("assignee").is(params.getAssignee().trim()));}if (StringUtils.isNotBlank(params.getCreator())) {queryParams.addCriteria(Criteria.where("creator").is(params.getCreator().trim()));}if (StringUtils.isNotBlank(params.getCreateName())) {queryParams.addCriteria(Criteria.where("creatorName").is(params.getCreateName().trim()));}if (StringUtils.isNotBlank(params.getExecutionName())) {Pattern pattern = Pattern.compile("^.*" + params.getExecutionName().trim() + ".*$", Pattern.CASE_INSENSITIVE);//通过流程标题或流程编号复合查询Criteria criteriaNameOrKey = new Criteria();criteriaNameOrKey.orOperator(Criteria.where("procInstName").regex(pattern),Criteria.where("businessKey").regex(pattern),Criteria.where("creatorName").regex(pattern));queryParams.addCriteria(criteriaNameOrKey);}if (params.getProcessStatus() != null) {queryParams.addCriteria(Criteria.where("processStatus").is(params.getProcessStatus().trim()));}if (StringUtils.isNotBlank(params.getStartTime()) && StringUtils.isNotBlank(params.getEndTime())) {queryParams.addCriteria(Criteria.where("startTime").gte(params.getStartTime().trim()).lte(params.getEndTime().trim()));}if (StringUtils.isNotBlank(params.getSystemSn())) {queryParams.addCriteria(Criteria.where("systemSn").is(params.getSystemSn().trim()));}queryParams.with(new Sort(Sort.Direction.DESC, "endTime"));int i = query.getInitPageIndex() < 1 ? 1 : query.getInitPageIndex();queryParams.skip((i - 1) * query.getPageSize()).limit(query.getPageSize());List<SearchTaskVo> datas = mongoTemplate.find(queryParams, SearchTaskVo.class, SearchTaskVo.TASK_TABLE);long count = mongoTemplate.count(queryParams, SearchTaskVo.TASK_TABLE);//去重datas = this.removal(datas);//翻译转阅this.turnReadTaskData(datas);//排序if (MapUtils.isNotEmpty(params.getOrderbyMap())){this.taskCommonSort(params.getOrderbyMap(),datas);}PagerModel<SearchTaskVo> pm = new PagerModel<>(count, datas);return pm;}

3.3.查询mongodb的实例数据

public PagerModel<SearchExecutionVo> querySearchExecutionVoPagerModel(QueryTaskVo params, com.dragon.tools.pager.Query query) {Query queryParams = new Query();//创建者工号if (StringUtils.isNotBlank(params.getCreator())) {queryParams.addCriteria(Criteria.where("startUser").is(params.getCreator()));}//创建者姓名if (StringUtils.isNotBlank(params.getCreateName())) {queryParams.addCriteria(Criteria.where("creatorName").is(params.getCreateName()));}if (StringUtils.isNotBlank(params.getProcessDefinitionKey())) {queryParams.addCriteria(Criteria.where("proDefKey").is(params.getProcessDefinitionKey()));}else {//转阅流程在已发不让显示queryParams.addCriteria(Criteria.where("proDefKey").ne(FlowConstant.TURN_READ));}if (StringUtils.isNotBlank(params.getExecutionName())) {Pattern pattern = Pattern.compile("^.*" + params.getExecutionName() + ".*$", Pattern.CASE_INSENSITIVE);// queryParams.addCriteria(Criteria.where("name").regex(pattern));// queryParams.addCriteria(Criteria.where("businessKey").regex(pattern));//通过流程标题或流程编号复合查询Criteria criteriaNameOrKey= new Criteria();criteriaNameOrKey.orOperator(Criteria.where("name").regex(pattern),Criteria.where("businessKey").regex(pattern));queryParams.addCriteria(criteriaNameOrKey);}if (StringUtils.isNotBlank(params.getProcessStatus())) {queryParams.addCriteria(Criteria.where("processStatus").is(params.getProcessStatus().trim()));}if (StringUtils.isNotBlank(params.getStartTime()) && StringUtils.isNotBlank(params.getEndTime())) {queryParams.addCriteria(Criteria.where("startTime").gte(params.getStartTime().trim()).lte(params.getEndTime().trim()));}if (StringUtils.isNotBlank(params.getSystemSn())) {queryParams.addCriteria(Criteria.where("systemSn").is(params.getSystemSn().trim()));}//默认开始时间降序queryParams.with(new Sort(Sort.Direction.DESC, "startTime"));queryParams.skip(((query.getInitPageIndex()==0?1:query.getInitPageIndex())-1)*query.getPageSize()).limit(query.getPageSize());List<SearchExecutionVo> datas = mongoTemplate.find(queryParams, SearchExecutionVo.class, SearchExecutionVo.EXECUTION_TABLE);//当前审批人查询出来this.createApprover(datas);//转阅流程特殊处理this.turnReadExecutionData(datas);if (MapUtils.isNotEmpty(params.getOrderbyMap())){this.excutionCommonSort(params.getOrderbyMap(),datas);}long count = mongoTemplate.count(queryParams, SearchExecutionVo.class, SearchExecutionVo.EXECUTION_TABLE);return new PagerModel<>(count, datas);}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/522297.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

IT公司老板落水,各部门员工怎么救??

戳蓝字“CSDN云计算”关注我们哦&#xff01;公司高层公司副总A&#xff1a;咱们开个会研究一下这个事情怎么处理。公司副总B&#xff1a;如果老板没有救成功&#xff0c;下任是谁呢&#xff1f;会不会影响公司的上市&#xff1f;公司副总C&#xff1a;我认为咱们开会应该讨论两…

使用 MaxCompute(原ODPS) java sdk 运行安全相关命令

摘要&#xff1a; 使用 odps console 的同学&#xff0c;可能都使用过 odps 安全相关的命令。 转自zhenhong 使用 MaxCompute console 的同学&#xff0c;可能都使用过 odps 安全相关的命令。官方文档上有详细的 odps 安全指南&#xff0c;并给出了安全相关命令列表。 简而言之…

苹果笔记本能不能用python_“苹”除了苹果还能组哪些词?苹组词,释义及造句汇总!...

“苹”字组词&#xff0c;很多人第一反应就是苹果。那么除了苹果&#xff0c;苹还能组哪些词&#xff1f;苹组词都有哪些&#xff1f;下面&#xff0c;浙江秦学教育小编为大家带来苹组词&#xff0c;释义及造句汇总!来更新我们的组词大全&#xff0c;大家一定要多积累&#xff…

历史回顾——NLP问题解决方案的演变史

摘要&#xff1a; 回顾NLP问题的解决方案&#xff0c;探寻当下最流行的NLP技术&#xff0c;激发NLP问题新的解决方案&#xff01;NLP-深度学习时代之前&#xff1a;在深度学习来临之前的日子里&#xff0c;在自然语言处理算法&#xff08;NLP&#xff09;领域出乎意料地有许多相…

关于signed和unsigned进行整形提升所出现的问题

看如下代码&#xff1a; int main() {char a -1;signed char b -1;unsigned char c -1;printf("a%d,b%d,c%d", a, b, c);return 0; }输出结果如下图所示 为什么会出现这种结果呢&#xff0c;现在我来分析一下 内存中存储这些变量都是以补码的方式进行存储&#x…

flowable BPMN的组件汉化

1.背景&#xff1a; 现在flowable流程设计器已经部分做了汉化&#xff0c;但是bpmn的组件还是没有汉化的&#xff0c;这样对我们中国 人来说就不是很方便。 2.效果&#xff1a;如何实现这一效果呢&#xff1f; 3.实现 3.1. stencilset_bpmn.json拷贝这个json文件到我们的资源…

华为确认与三家EDA公司停止合作;开源安卓恶意软件窃取用户隐私信息;三星高通回应7纳米EUV工艺问题……...

关注并标星星CSDN云计算极客头条&#xff1a;速递、最新、绝对有料。这里有企业新动、这里有业界要闻&#xff0c;打起十二分精神&#xff0c;紧跟fashion你可以的&#xff01;每周三次&#xff0c;打卡即read更快、更全了解泛云圈精彩newsgo go go 速腾聚创与英国 Aidrivers达…

MaxCompute Console 实用小命令

摘要&#xff1a; MaxCompute Console 可以从 这里 下载。在阿里云官网可以查看 帮助文档。 这里跟大家分享一些 MaxCompute Console 中实用的小命令。 MaxCompute Console 可以从 这里 下载。在阿里云官网可以查看 帮助文档。 这里跟大家分享一些 MaxCompute Console 中实用的…

一个form 如何做两次提交_如何做一个优秀的家长

如何做一个优秀的家长文|潍坊坊子崇文中学父母对待孩子无外乎三种情况&#xff1a;一是事事管、时时管&#xff0c;做了很多事&#xff0c;效果却不好&#xff1b;二是什么都不管&#xff0c;什么都不做&#xff0c;放任自流&#xff0c;不闻不问&#xff0c;结果更不好&#x…

动态执行shell脚本

文章目录一、linux动态执行指定脚本二、需求思路分析①我要做什么&#xff1f;②先手动执行一遍流程③ 把执行命令记录下来三、动态执行脚本①手动制作脚本②脚本升级③ 脚本截图一、linux动态执行指定脚本 脚本目录 /app/CodeQualityScan/gblfy_cx/脚本名 sonar-scanner.sh用…

用冒泡排序的思想,模拟实现qsort函数

首先&#xff0c;要理解什么是冒泡排序&#xff0c;冒泡排序首先就是把无序的一组数&#xff0c;转化成为有序的&#xff0c;像冒泡一样&#xff0c;把排序好的数&#xff0c;一点点的冒出来&#xff0c;比如如下代码 void buffle_sort(int* arr,int sz){//i代表了需要冒泡排序…

关于机器学习,你需要知道的三件事!

摘要&#xff1a; MATLAB开发运营团队深度解析何为机器学习&#xff0c;什么时候使用机器学习&#xff0c;如何选择机器学习算法&#xff0c;MATLAB到底能为机器学习提供怎样的便利&#xff1f;机器学习是一种数据分析技术&#xff0c;让计算机执行人和动物与生俱来的活动&…

京东云的区块链“经”

戳蓝字“CSDN云计算”关注我们哦&#xff01;就在不久前&#xff0c;京东云在北京国家会议中心召开“区块链京东云 大有可为”战略合作媒体沟通会。会上&#xff0c;京东云与京东数科宣布了在区块链技术服务领域深度合作&#xff0c;重磅发布了智臻链“云”建设规划&#xff0c…

MaxCompute Tunnel SDK数据上传利器——BufferedWriter使用指南

摘要&#xff1a; MaxCompute 的数据上传接口&#xff08;Tunnel&#xff09;定义了数据 block 的概念&#xff1a;一个 block 对应一个 http request&#xff0c;多个 block 的上传可以并发而且是原子的&#xff0c;一次同步请求要么成功要么失败&#xff0c;不会污染其他的 b…

cnpm不是内部或外部命令 cnpm: command not found 解决方案 cnpm

问题是处在于 你没用用淘宝的镜像 安装cnpm npm install cnpm -g --registryhttps://registry.npm.taobao.org验证 cnpm -v

库函数strlen的模拟实现

1、对于strlen这个库函数来说&#xff0c;主要就是求字符串的长度的&#xff0c;无论何时&#xff0c;只要遇到‘\0’,求得的长度都会戛然而止&#xff0c;可以看一下例子 #include<stdio.h> #include<string.h> int main(){char* str1[]"abcdef";char*…

MaxCompute 中的Code Generation技术简介

摘要&#xff1a; 前言 在《数据库系统中的Code Generation技术介绍》中&#xff0c;我们简单介绍了一下Code Generation技术及其在大规模OLAP系统&#xff0c;特别是大规模分布式OLAP系统中的重要性。MaxCompute采用了Code Generation技术来提高计算效率。在MaxCompute 前言 …

java调用python_Python教程:17个冷门但实用的小技巧

Python是机器学习的主流语言&#xff0c;没有之一。今年5月&#xff0c;它首次在PYPL排行榜上超越JAVA&#xff0c;成为全球第一大编程语言。而一个月后&#xff0c;Stack Overflow也分享了最新的编程语言浏览量统计数字&#xff0c;结果显示&#xff0c;Python的月活历史性地超…

Hadoop精华问答 | NameNode的工作特点

我们很荣幸能够见证Hadoop十年从无到有&#xff0c;再到称王。感动于技术的日新月异时&#xff0c;让我们再来看看关于Hadoop的精华问答。1Q&#xff1a;NameNode的工作特点A&#xff1a;NameNode始终在内存中保存metedata&#xff0c;用于处理“读请求”&#xff0c;到有“写请…

五个非常实用的自然语言处理资源

摘要&#xff1a; 正在学习NLP&#xff0c;手中没有资源&#xff1f;快来看看这些免费的NLP学习资源吧&#xff01;如果你对自然语言处理方面的资源感兴趣&#xff0c;请仔细阅读本篇文章。运行数据科学POC的7个步骤网上有很多依靠深度学习方法的NLP资源&#xff0c;有一些资源…