日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

flowable 集成mongodb

發(fā)布時間:2024/9/27 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 flowable 集成mongodb 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

學(xué)無止境,活到老學(xué)到老,每天都問自己進(jìn)步了嗎?

1.背景
由于公司每天有至少1500個表單發(fā)起,處理待辦任務(wù)至少7000個,累計(jì)歷史任務(wù)數(shù)據(jù)已經(jīng)達(dá)到200多w條,時間一長,通過數(shù)據(jù)庫查詢已辦的任何和我發(fā)起的流程巨慢

所以我們考慮到這些數(shù)據(jù)能不能放入ES或者是mongodb中

流程中心1.0版本集成的是ES,速度確實(shí)非???#xff0c;提升查詢性能近萬倍,但是由于ES是一個全文檢索的系統(tǒng),對我們這些業(yè)務(wù)數(shù)據(jù)來說,不是很適合,比方說

我們的表單數(shù)據(jù),他直接給分詞了,不符合業(yè)務(wù)的要求。

流程中心2.0版本我們就改成mongodb,速度一樣達(dá)到es的查詢效果,解決了以前分詞的問題,而且數(shù)據(jù)結(jié)構(gòu)化查詢也非常方便。

2.集成mongodb策略
集成mongodb的策略有兩種

2.1.利用flowable提供的mongodb的插件來集成,具體可以參考他們提供的demo
2.2通過流程實(shí)例id和任務(wù)id查詢表數(shù)據(jù),做加工處理,然后在通過消息隊(duì)列的方式同步到mongodb中
第一種方式就相當(dāng)于把歷史表的數(shù)據(jù)全部搬到mongodb中,在關(guān)系型數(shù)據(jù)庫中不存放任何歷史數(shù)據(jù),正是由于中原因,我擔(dān)心歷史數(shù)據(jù)的丟失,所以我采用的是

第二種策略,關(guān)系數(shù)據(jù)庫中有一份數(shù)據(jù),在mongodb中我也有一份加工后的數(shù)據(jù),以保證萬無一失。

3.具體實(shí)現(xiàn)
3.1 同步數(shù)據(jù)

@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("接受到的數(shù)據(jù)為:" + 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("歷史隊(duì)列中錯誤的數(shù)據(jù)" + message, message);}} catch (Exception e) {logger.error("歷史隊(duì)列中錯誤的數(shù)據(jù)"+ message, e);}}} }

3.2 查詢mongodb的任務(wù)數(shù)據(jù)

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);//通過流程標(biāo)題或流程編號復(fù)合查詢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);//翻譯轉(zhuǎn)閱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的實(shí)例數(shù)據(jù)

public PagerModel<SearchExecutionVo> querySearchExecutionVoPagerModel(QueryTaskVo params, com.dragon.tools.pager.Query query) {Query queryParams = new Query();//創(chuàng)建者工號if (StringUtils.isNotBlank(params.getCreator())) {queryParams.addCriteria(Criteria.where("startUser").is(params.getCreator()));}//創(chuàng)建者姓名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 {//轉(zhuǎn)閱流程在已發(fā)不讓顯示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));//通過流程標(biāo)題或流程編號復(fù)合查詢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()));}//默認(rèn)開始時間降序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);//當(dāng)前審批人查詢出來this.createApprover(datas);//轉(zhuǎn)閱流程特殊處理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);}

總結(jié)

以上是生活随笔為你收集整理的flowable 集成mongodb的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。