flowable 集成mongodb

flowable 集成mongodb学无止境,活到老学到老,每天都问自己进步了吗?1.背景由于公司每天有至少1500个表单发起,处理待办任务至少7000个,累计历史任务数据已经达到200多w条,时间一长,通过数据库查询已办的任何和我发起的流程巨慢所以我们考虑到这些数据能不能放入ES或者是mongodb中流程中心1.0版本集成的是ES,速度确实非常快,提升查询性能近万倍,但是由于ES是一个全文检索的系统,对我们这些业务数据来说…

大家好,又见面了,我是你们的朋友全栈君。

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

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

    @Autowired
    private ISyncHisService syncHisService;

    @RabbitHandler
    public 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);
    }
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/145025.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • KNN 回归算法_DTW算法

    KNN 回归算法_DTW算法KNN算法也能够用于回归预测。KNN算法用于分类的方法如下:首先,对于一个新来的预测实例,我们在训练集上寻找它的最相近的K个近邻;然后,采用投票法将它分到这K个邻居中的最多的那个类。但是,怎么将KNN算法用于回归呢?其实大致的步骤是一样的,也是对新来的预测实例寻找K近邻,然后对这K个样本的目标值取均值即可作为新样本的预测值。…

    2022年8月21日
  • Linux 软连接「建议收藏」

    Linux 软连接「建议收藏」1.Linux链接概念Linux链接分两种,一种被称为硬链接(HardLink),另一种被称为符号链接(SymbolicLink)。默认情况下,ln命令产生硬链接。【硬连接】硬连接指通过索引节点来进行连接。在Linux的文件系统中,保存在磁盘分区中的文件不管是什么类型都给它分配一个编号,称为索引节点号(InodeIndex)。在Linux中,多个文件名指向同一索引节点是存在的。一

    2022年9月30日
  • PHP条件语句if的使用

    PHP条件语句if的使用

    2021年10月9日
  • 游戏编程编程学习推荐

    游戏编程编程学习推荐一下资料是从网上搜集的推荐,非本人原创,作为自己学习使用不要单单看批处理了,学powershell,.net驱动,功能强大我觉得shell脚本用的挺多的啊,bat还是很少用到.不过经常接触到,所以我

    2022年8月2日
  • java 字符串和整型的相互转换_java字符串转整型数组

    java 字符串和整型的相互转换_java字符串转整型数组Java中字符串转整型和整型转字符串1.字符串转整型Java代码,字符串为纯数字的情况下,调用Integer的静态方法parseInt或者valueOfJava代码,如果单个字符或字符串,需要切开转化为char字符再转化,否则按照上述方法会出现空指针异常(ASCLL码0:**48**a:**97**A:**65**)2.整型转字符串Java代码,3种方法1.字符串转整型Java代码,字符串为纯数字的情况下,调用Integer的静态方法parseInt或者valueOfpublicclass

    2022年10月9日
  • php fastcgi,配置apache以fastcgi运行php[通俗易懂]

    php fastcgi,配置apache以fastcgi运行php[通俗易懂]apache默认是用自带的mod_php模块运行php,现在我们介绍使用fastcgi来执行php脚本。先说下fastcgi的优点:Fastcgi的优点:从稳定性上看,fastcgi是以独立的进程池运行来cgi,单独一个进程死掉,系统可以很轻易的丢弃,然后重新分配新的进程来运行逻辑.·从安全性上看,Fastcgi支持分布式运算.fastcgi和宿主的server完全独立,fastc…

    2022年7月11日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号