起步软件技术论坛
搜索
 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 30506|回复: 39

[处理中3] 流程流转速度慢问题!

[复制链接]

87

主题

397

帖子

1330

积分

金牌会员

Rank: 6Rank: 6

积分
1330
QQ
发表于 2018-2-28 17:24:21 | 显示全部楼层 |阅读模式
版本: X5.2.7 小版本号:
数据库: Oracle 服务器操作系统: Windows 应用服务器:
客户端操作系统: Windows 7 浏览器: Chrome
在业务模块中,流程流转时打开流转对话框后,点确定按钮执行速度慢。
检查后发现process组件调用process.js的advance方法,
justep.ProcessEngine.prototype.advance = function(options){
    return this.advanceExt(this.getTask(), null, options);
};
justep.ProcessEngine.prototype.advanceExt = function(task, processControl, options){
    return this._doProcess(task, processControl, "advance", this._advanceAction,
        this.BEFORE_ADVANCE, this.AFTER_ADVANCE, this.ADVANCE_COMMIT, this.ADVANCE_ERROR, options);
};

justep.ProcessEngine.prototype._doProcess方法中debugger发现,其1618行justep.Request.endBatch();语句执行时间过长,约为5~7s。
请问什么样的数据会影响此语句的执行时间?

通过demo的发文流程测试,发现没有执行时间过长的现象。

91

主题

13万

帖子

3万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
36067
发表于 2018-2-28 17:32:35 | 显示全部楼层
1.F12打开浏览器的开发人员调试工具看看network监控的具体哪个请求慢
2.把sql语句的执行时间打出来看看是不是操作任务表慢
  http://bbs.wex5.com/forum.php?mo ... 4&pid=165004035
远程的联系方法QQ1392416607,添加好友时,需在备注里注明其论坛名字及ID,公司等信息
发远程时同时也发一下帖子地址,方便了解要解决的问题  WeX5教程  WeX5下载



如按照该方法解决,请及时跟帖,便于版主结贴
回复 支持 反对

使用道具 举报

87

主题

397

帖子

1330

积分

金牌会员

Rank: 6Rank: 6

积分
1330
QQ
 楼主| 发表于 2018-3-1 09:18:24 | 显示全部楼层
本帖最后由 boolean 于 2018-3-1 09:22 编辑
jishuang 发表于 2018-2-28 17:32
1.F12打开浏览器的开发人员调试工具看看network监控的具体哪个请求慢
2.把sql语句的执行时间打出来看看是不 ...

1、浏览器network显示endExecute.j请求慢,执行时长4s-7s。
2、sql语句打印了执行速度单条没有超过500ms,所有sql总时长没有超过2000ms。
其中advanceProcessQueryAction总时长超过了5000ms,添加了打印语句显示,
发现在打印222222222后,执行engine.advanceQuery();超过了2000-5000ms。
public static ProcessControl advanceProcessQuery(String task) {
                System.out.println("1111111111111111111111111advanceProcess:"+new Date().getTime());
                ProcessEngine engine = (ProcessEngine) ProcessUtils.getProcessContext();
                System.out.println("2222222222222222222222222advanceProcess:"+new Date().getTime());
                engine.advanceQuery();
                System.out.println("3333333333333333333333333advanceProcess:"+new Date().getTime());
                return engine.getProcessControl();
        }
通过SQL执行记录看,并不是SQL执行速度慢,而是执行
SELECT org.sFID AS sFID, org.sFName AS sFName
    FROM x5.SA_OPOrg org
    JOIN x5.SA_OPAuthorize auth
      ON org.sFID LIKE auth.SORGFID ||'%'
   WHERE (org.SVALIDSTATE = '1')
     AND ((auth.sAuthorizeRoleID = 'RL-SYSTEM') OR (auth.sAuthorizeRoleID = '7345F3F262D64EE49460350E9D825264'))
   ORDER BY org.SSEQUENCE ASC;
后停顿了2000-5000ms的时间,再打印的
select * from x5.sa_oprole t where t.sid= 'A3E4EE554EEB48E6BF957891B67B63B8'
   SELECT c.SCONTENT AS sContent
     FROM x5.SA_ProcessControl c
    WHERE (c.SPROCESS = '/ProjectManager/ContractMgr/process/TemplateFlow_ContractSigned_xin_1/templateFlow_ContractSigned_xin_1Process')
      AND (c.SACTIVITY = 'businessActivity4')
      AND (c.SOPERATORID = 'PSN01')
      AND (c.SACTION = 'advanceProcessAction')
      AND ((c.SPROCESSTEMPLATEID2 IS NULL) OR (c.SPROCESSTEMPLATEID2 = ''))
后advanceProcessQueryAction结束。
回复 支持 反对

使用道具 举报

91

主题

13万

帖子

3万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
36067
发表于 2018-3-1 09:54:31 | 显示全部楼层
2楼的打印sql时间的方式设置一下,然后把tomcat控制台打印出来的信息发一下看看
远程的联系方法QQ1392416607,添加好友时,需在备注里注明其论坛名字及ID,公司等信息
发远程时同时也发一下帖子地址,方便了解要解决的问题  WeX5教程  WeX5下载



如按照该方法解决,请及时跟帖,便于版主结贴
回复 支持 反对

使用道具 举报

87

主题

397

帖子

1330

积分

金牌会员

Rank: 6Rank: 6

积分
1330
QQ
 楼主| 发表于 2018-3-1 10:09:57 | 显示全部楼层
jishuang 发表于 2018-3-1 09:54
2楼的打印sql时间的方式设置一下,然后把tomcat控制台打印出来的信息发一下看看 ...

tomcat信息在附件中。

tomcat控制台.zip

8.21 KB, 下载次数: 463

tomcat控制台信息

回复 支持 反对

使用道具 举报

91

主题

13万

帖子

3万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
36067
发表于 2018-3-1 10:25:58 | 显示全部楼层
这个流程所有的环节流转都慢还是就这个环节流转慢?流程图复杂吗?把流程图发一下看看
远程的联系方法QQ1392416607,添加好友时,需在备注里注明其论坛名字及ID,公司等信息
发远程时同时也发一下帖子地址,方便了解要解决的问题  WeX5教程  WeX5下载



如按照该方法解决,请及时跟帖,便于版主结贴
回复 支持 反对

使用道具 举报

87

主题

397

帖子

1330

积分

金牌会员

Rank: 6Rank: 6

积分
1330
QQ
 楼主| 发表于 2018-3-1 10:42:27 | 显示全部楼层
jishuang 发表于 2018-3-1 10:25
这个流程所有的环节流转都慢还是就这个环节流转慢?流程图复杂吗?把流程图发一下看看 ...

所有流程都慢,流程图不复杂,都是直线流程,环节多。demo的不慢
回复 支持 反对

使用道具 举报

91

主题

13万

帖子

3万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
36067
发表于 2018-3-1 11:19:38 | 显示全部楼层
自己模块中是不是全局接管了流程事件,事件中做了什么操作导致的?
可以创建一个简单的两个环节的流程看看
远程的联系方法QQ1392416607,添加好友时,需在备注里注明其论坛名字及ID,公司等信息
发远程时同时也发一下帖子地址,方便了解要解决的问题  WeX5教程  WeX5下载



如按照该方法解决,请及时跟帖,便于版主结贴
回复 支持 反对

使用道具 举报

87

主题

397

帖子

1330

积分

金牌会员

Rank: 6Rank: 6

积分
1330
QQ
 楼主| 发表于 2018-3-1 11:39:43 | 显示全部楼层
本帖最后由 boolean 于 2018-3-1 11:48 编辑
jishuang 发表于 2018-3-1 11:19
自己模块中是不是全局接管了流程事件,事件中做了什么操作导致的?
可以创建一个简单的两个环节的流程看看 ...

做了个3环节的流程,速度还是一样的。
是接管了流程事件,advanceProcessQueryListener事件如下
        public static void advanceProcessQueryListener() {
                System.out.println("advanceProcessQueryListener开始:"+new Date().getTime());
                ProcessControl control = ProcessUtils.getProcessContext().getProcessControl();
                String sData1 = ProcessUtils.getProcessData1();//业务数据fid
                String sFlowID = ProcessUtils.getProcessContext().getTask().getFlow();//流程实例ID 避免相同数据走多次流程用 2016-07-01
                control.setSaveHistory(false);
                control.setDialogEnabled(false);
               
                for (ProcessControlItem to : control.getFlowTos()){
                        if(!to.isEnd()) {
                                List<List<String>> list = new ArrayList<List<String>>();
                                String activityLabel = to.getTask().getActivityName();//环节名称
                                String sExecutorFIDS = (String) BizUtils.getRelationValue("OA_FLOW_CONFIG", null, "(OA_FLOW_CONFIG.ActivityLabel = '" + activityLabel + "') AND (OA_FLOW_CONFIG.DataID = '" + sData1 + "') AND (OA_FLOW_CONFIG.FlowID = '"+sFlowID+"' or OA_FLOW_CONFIG.FlowID is null)", null, "sExecutorFID", "/ProjectManager/DataDicMgr/data");
                                String[] arrIDS = sExecutorFIDS.split(",");
                                String project_code="";
                                for(String id : arrIDS) {
                                        List<String> list2 = new ArrayList<String>();
                                        String fids = id.substring(id.lastIndexOf("/")+1,id.lastIndexOf("."));
                                        list2.add(fids.split("@")[1]);list2.add(fids.split("@")[0]);list.add(list2);
                                        String person_id = ContextHelper.getPerson().getID();
                                        project_code = (String) BizUtils.getRelationValue("SA_Task", null, "(SA_Task.sFlowID = '" + sFlowID + "')", null, "sESField04", "/system/data");
                                        if(project_code!=null&&!"".equals(project_code)){
                                                String user_project = (String) BizUtils.getRelationValue("USER_PROJECT", null, "(USER_PROJECT.PROJECT_CODE = '" + project_code + "') AND (USER_PROJECT.MasterID = '" + person_id + "')", null, "MasterID", "/ProjectManager/DataDicMgr/data");
                                                if(user_project==null||"".equals(user_project)){
                                                        String instersql = "insert into USER_PROJECT (fid,project_code,MasterID,version) values ('"+CommonUtils.createGUID()+"','"+project_code+"','"+person_id+"',0)";
                                                        HashMap<String,String> sqlMap = new HashMap<String,String>();
                                                        sqlMap.put(DatabaseProduct.ORACLE.name(),instersql);
                                                        SQL.executeUpdate(sqlMap,null,DataModel);
                                                        String upsql = "update SA_OPPerson t set t.sEnglishName = '合同列表' where t = '" + person_id + "'";
                                                        KSQL.executeUpdate(upsql, null, "/system/data", null);
                                                }
                                        }
                                }
                                List<OrgUnit> listOrg = OrgUtils.findPersonMembersByIDList(list);
                                //修改默认执行者
                                to.clearExecutors();
                                to.addExecutors(listOrg);
                                to.setTaskAssignMode("together");//设置任务分配模式共同
                                to.addTaskRelation("sExecuteMode", TaskExecuteMode.SIMULTANEOUS);//设置执行模式同时

                        }
                }
                System.out.println("advanceProcessQueryListener结束:"+new Date().getMinutes());
        }

从tomcat控制台信息看,是在走这个事件之前就慢。
回复 支持 反对

使用道具 举报

91

主题

13万

帖子

3万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
36067
发表于 2018-3-1 13:28:32 | 显示全部楼层
先把这个监听去掉看看
远程的联系方法QQ1392416607,添加好友时,需在备注里注明其论坛名字及ID,公司等信息
发远程时同时也发一下帖子地址,方便了解要解决的问题  WeX5教程  WeX5下载



如按照该方法解决,请及时跟帖,便于版主结贴
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|X3技术论坛|Justep Inc.    

GMT+8, 2024-11-22 16:26 , Processed in 0.056400 second(s), 28 queries .

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表