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

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);}

flowable 集成mongodb相关推荐

  1. Windows下安装Mongodb SpringBoot集成MongoDB和Redis多数据源

    全文内容: Mongodb安装 说明:Mongodb和redis是开发中常用的中间件,Redis的安装使用比较简单就不写了,只说本地也就是Windows安装Mongodb. SpringBoot集成M ...

  2. 6.3 Spring Boot集成mongodb开发

    6.3 Spring Boot集成mongodb开发 本章我们通过SpringBoot集成mongodb,Java,Kotlin开发一个极简社区文章博客系统. 0 mongodb简介 Mongo 的主 ...

  3. Spring系列之集成MongoDB的2种方法,你知道嘛?

    Spring系列之集成MongoDB的2种方法,你知道嘛? MongoDB是最流行的NoSQL数据库,SpringBoot是使用Spring的最佳实践.今天带大家讲一讲SpringBoot集成Mong ...

  4. 大数据之mongodb -- (2)java集成 MongoDB 3.2,使用Spring-data-mongodb进行集成

    Java集成MongoDB有很多方式,可以直接用mongodb的java驱动程序来发送语句到mongodb服务器,也可以用第三方的工具包来做. (1) 选择版本 选择的就是springdata集成的m ...

  5. SpringBoot集成MongoDB

    SpringBoot集成MongoDB Pom依赖 <dependency><groupId>org.springframework.boot</groupId>& ...

  6. Asp.Net Core Web Api图片上传(一)集成MongoDB存储实例教程

    Asp.Net Core Web Api图片上传(一)集成MongoDB存储实例教程 原文:Asp.Net Core Web Api图片上传(一)集成MongoDB存储实例教程 Asp.Net Cor ...

  7. springboot集成mongoDB 异常认证

    springboot集成mongoDB 异常认证 参考文章: (1)springboot集成mongoDB 异常认证 (2)https://www.cnblogs.com/mh-study/p/980 ...

  8. flowable集成spring boot ----任务监听器

    任务监听器 任务监听器(task listener)用于在特定的任务相关事件发生时,执行自定义的Java逻辑或表达式. 任务监听器包含下列属性: event(事件)(必填):触发任务监听器的任务事件类 ...

  9. Flowable集成自定义表单001

    #Flowable集成自定义表单 flowable集成自定义表单实现低代码开发平台 文章目录 演示 一.代码地址 二.演示地址 总结 演示 后台配置流程和表单 一.代码地址 代码地址 二.演示地址 后 ...

最新文章

  1. oracle查询表中的某一行,oracle查看所有表及各表行数?
  2. sql的nvl()函数
  3. Qt / SIGNAL、SLOT、signals、slots、emit 关键字含义
  4. 学习记录-class与namespace的区别
  5. 一道很熟悉的前端面试题,你怎么答?
  6. network-monitor
  7. [转]Android--多线程之Handler
  8. python模块导入三种方式
  9. 流媒体服务器搭建之Red5
  10. 中标麒麟V7安装Qt5.13.0
  11. ant design pro 水印(删除、修改)
  12. 《LoRaWAN网络服务器演示:概要描述(R1.0)》部分翻译
  13. 【沃顿商学院学习笔记】宏观经济学——05中产阶级Middle Class
  14. mybatis获取map中的key和value
  15. httpclient3 自动登陆淘宝, 开心网
  16. 桌面图标小箭头去除方法
  17. 使用分布式词汇对比词向量区分正反义词
  18. html mysql留言板_html留言板
  19. A40i使用笔记:交叉编译*.c文件(可在开发板运行)
  20. vue里 a(){} 和a:()=>{}的区别

热门文章

  1. 《世界已无法阻挡Python入侵!》(附学习资源)
  2. 大数学家陶哲轩谈时间管理与高效工作的方法
  3. hbase/thrift/go连接失败
  4. Linux vim 全选
  5. 顺序表应用5:有序顺序表归并
  6. Hbase Solr 二级索引,更新数据部分字段丢失问题
  7. error C1128:字节数超过对象文件格式xxxx.cpp限制:请使用/bigobj进行编译 cmake的解决方式
  8. 阿里云云效技术专家分享:云原生开发、调测及可靠发布解决方案
  9. 好代码实践:基于Redis的轻量级分布式均衡消费队列
  10. Fish Redux中的Dispatch是怎么实现的?