重写jxstar审批,进行批量同意时使用线程池,减少前台等待时间

本文档展示了对Java工作流客户端类`ProcessClientBO`的重构,以及引入线程池实现后台审批流程的优化。在`ProcessClientBO`中,重写了创建和执行流程的方法,使用线程池`ThreadPoolServerImpl`以减少前端等待时间。同时,`ThreadPoolServerImpl`类负责线程池的管理和任务分配,确保了审批流程的并发执行。
摘要由CSDN通过智能技术生成

重写类:ProcessClientBO,另外两个类为线程池新增类

ProcessClientBO重写部分代码块

package org.jxstar.wf.client;

import java.util.List;
import java.util.Map;
import java.util.concurrent.ThreadPoolExecutor;

import org.jxstar.control.action.RequestContext;
import org.jxstar.dao.DaoParam;
import org.jxstar.service.BusinessObject;
import org.jxstar.service.util.TaskUtil;
import org.jxstar.util.DateUtil;
import org.jxstar.util.MapUtil;
import org.jxstar.util.config.SystemVar;
import org.jxstar.util.factory.FactoryUtil;
import org.jxstar.util.log.Log;
import org.jxstar.util.resource.JsMessage;
import org.jxstar.wf.WfException;
import org.jxstar.wf.define.WfDefineDao;
import org.jxstar.wf.engine.ProcessContext;
import org.jxstar.wf.engine.ProcessInstance;
import org.jxstar.wf.engine.ProcessInstanceManager;
import org.jxstar.wf.engine.TaskInstance;
import org.jxstar.wf.engine.TaskInstanceDao;
import org.jxstar.wf.engine.Token;
import org.jxstar.wf.engine.TokenDao;
import org.jxstar.wf.util.ProcessUtil;

import com.eam.sp.SpOutBO;
import com.eam.utils.WfClientUtil;

@SuppressWarnings("all")
public class ProcessClientBO extends BusinessObject {
    private static final long serialVersionUID = -6406373057929422076L;

    public String createProcess(RequestContext paramRequestContext) {
        String str = paramRequestContext.getFunID();
        if (!(ProcessUtil.isNeedWf(str))) {
            this._log.showDebug("【{0}】功能定义中的“有效记录值”不是“审批通过”,不会执行流程启动检查!", new Object[]{str});
            return _returnSuccess;
        }
        String[] arrayOfString = paramRequestContext.getRequestValues("keyid");
        if ((arrayOfString == null) || (arrayOfString.length == 0)) {
            setMessage(JsMessage.getValue("processclientbo.noid"));
            return _returnFaild;
        }

        Map localMap = paramRequestContext.getUserInfo();
        if ((localMap == null) || (localMap.isEmpty())) {
            setMessage(JsMessage.getValue("processclientbo.nouser"));
            return _returnFaild;
        }
        return _$1(str, arrayOfString, localMap);
    }

    private String _$1(String paramString, String[] paramArrayOfString, Map<String, String> paramMap) {
        String str1 = MapUtil.getValue(paramMap, "tenant_id");
        Map localMap1 = _$1(paramString, str1);
        if (localMap1.isEmpty()) {
            this._log.showDebug(JsMessage.getValue("processclientbo.noprocess"), new Object[]{paramString});
            return _returnSuccess;
        }
        String str2 = MapUtil.getValue(localMap1, "exe_delay", "0");
        String str3 = SystemVar.getValue("wf.instance.delay");
        String str4 = (String) localMap1.get("process_title");
        String str5 = "";
        int i = 0;
        int j = paramArrayOfString.length;
        while (i < j) {
            String str6 = paramArrayOfString[i];
            /**
             * 判断是否走审批流程
             */
            if (WfClientUtil.isApproval(paramString, str6)) {
                this._log.showDebug("【{0}】功能已跳过审批流程", new Object[]{paramString});
                ++i;
                continue;
            }
            Map localMap2 = ProcessUtil.queryFunData(paramString, str6);
            if (localMap2.isEmpty()) {
                setMessage(JsMessage.getValue("processclientbo.nodata"));
                return _returnFaild;
            }
            if (str4.length() > 0) {
                str5 = TaskUtil.parseAppField(str4, localMap2, false);
                if (str5.length() > 100)
                    str5 = str5.substring(0, 100) + "...";
                localMap1.put("process_title", str5);
            }
            ProcessInstanceManager localProcessInstanceManager = ProcessInstanceManager.getInstance();
            ProcessInstance localProcessInstance = localProcessInstanceManager.createProcess(str6, paramMap, localMap2, localMap1);
            try {
                localProcessInstance.create();
                if ((str3.equals("0")) || (str2.equals("0"))) {
                    ProcessContext localProcessContext = localProcessInstanceManager.createInitContext(localProcessInstance);
                    localProcessContext.setUserInfo(paramMap);
                    localProcessInstance.startup(localProcessContext);
                }
            } catch (WfException localWfException) {
                this._log.showError(localWfException);
                setMessage(localWfException.getMessage());
                return _returnFaild;
            }
            ++i;
        }
        return _returnSuccess;
    }

    public String executeProcess(RequestContext paramRequestContext) {

        try {
            ProcessContext[] arrayOfProcessContext = _$2(paramRequestContext);
            String str1 = paramRequestContext.getRequestValue("check_funid");
            String str2 = MapUtil.getValue(paramRequestContext.getUserInfo(), "tenant_id");
            String str3 = MapUtil.getValue(_$1(str1, str2), "exe_delay", "0");
            String str4 = SystemVar.getValue("wf.instance.delay");
            this._log.showDebug("..........exe_delay=" + str3 + ";wf.instance.delay=" + str4);
            int i = 0;
            int j = arrayOfProcessContext.length;

            /**-----后台线程池审批,减少前端等待 start-----**/
            final ThreadPoolServerImpl impl = new ThreadPoolServerImpl(arrayOfProcessContext, str3);
            Runnable runnable = new Runnable() {
                public void run() {
                    impl.performLockProcess();
                }
            };
            new Thread(runnable).start();
            /**-----后台线程池审批,减少前端等待 end-----**/

            /**while (i < j)
             {
             ProcessInstance localProcessInstance = arrayOfProcessContext[i].getProcessInstance();
             localProcessInstance.execute(arrayOfProcessContext[i]);
             if ((str4.equals("0")) || (str3.equals("0")))
             {
             TaskInstance localTaskInstance = arrayOfProcessContext[i].getTaskInstance();
             localTaskInstance.complete(arrayOfProcessContext[i]);
             }
             ++i;
             }**/
        } catch (WfException localWfException) {
            this._log.showError(localWfException);
            setMessage(localWfException.getMessage());
            return _returnFaild;
        }
        return _returnSuccess;
    }

    public String returnProcess(RequestContext paramRequestContext) {
        String[] arrayOfString = paramRequestContext.getRequestValues("taskid");
        if ((arrayOfString == null) || (arrayOfString.length == 0)) {
            String str1 = paramRequestContext.getRequestValue("check_funid");
            String str2 = paramRequestContext.getRequestValue("keyid");
            arrayOfString = TaskInstanceDao.getInstance().queryTaskId(str1, str2);
            if ((arrayOfString == null) || (arrayOfString.length == 0)) {
                setMessage(JsMessage.getValue("wfdefine.text7"));
                return _returnFaild;
            }
            paramRequestContext.setRequestValue("taskid", arrayOfString);
        }
        String str1 = ProcessUtil.getInstanceId(arrayOfString[0]);
        String str2 = MapUtil.getValue(paramRequestContext.getUserInfo(), "user_id");
        try {
            if (!(ProcessUtil.isStarted(str1))) {
                if (!(ProcessUtil.equalStartUser(str1, str2))) {
                    setMessage(JsMessage.getValue("wfdefine.text8"));
                    return _returnFaild;
                }
                if (!(ProcessUtil.updateAudit(str1))) {
                    setMessage(JsMessage.getValue("wfdefine.text9"));
                    return _returnFaild;
                }
                if (!(ProcessUtil.deleteInstance(str1))) {
                    setMessage(JsMessage.getValue("wfdefine.text10"));
                    return _returnFaild;
                }
                return _returnSuccess;
            }
            String str3 = _$3(paramRequestContext);
            if ((str3 == null) || (str3.length() == 0)) {
                setMessage(JsMessage.getValue("wfdefine.text11"));
                return _returnFaild;
            }
            paramRequestContext.setRequestValue("next_nodeid", str3);
            ProcessContext[] arrayOfProcessContext = _$2(paramRequestContext);
            int i = 0;
            int j = arrayOfProcessContext.length;
            while (i < j) {
                ProcessInstance localProcessInstance = arrayOfProcessContext[i].getProcessInstance();
                localProcessInstance.execute(arrayOfProcessContext[i]);
                TaskInstance localTaskInstance = arrayOfProcessContext[i].getTaskInstance();
                localTaskInstance.complete(arrayOfProcessContext[i]);
                ++i;
            }
        } catch (WfException localWfException) {
            this._log.showError(localWfException);
            setMessage(localWfException.getMessage());
            return _returnFaild;
        }
        return _returnSuccess;
    }

    private String _$3(RequestContext paramRequestContext)
            throws WfException {
        String str1 = "";
        String str2 = (String) paramRequestContext.getUserInfo().get("user_id");
        String str3 = paramRequestContext.getRequestValue("check_funid");
        String[] arrayOfString = paramRequestContext.getRequestValues("keyid");
        if ((arrayOfString == null) || (arrayOfString.length == 0))
            throw new WfException(JsMessage.getValue("processclientbo.noid"));
        TaskInstanceDao localTaskInstanceDao = TaskInstanceDao.getInstance();
        int i = 0;
        int j = arrayOfString.length;
        while (i < j) {
            Map localMap = localTaskInstanceDao.queryHisTask(str3, arrayOfString[i]);
            if (localMap.isEmpty())
                throw new WfException(JsMessage.getValue("processclientbo.nohistask"));
            String str4 = (String) localMap.get("check_userid");
            if (!(str2.equals(str4))) {
                String str5 = (String) localMap.get("check_user");
                throw new WfException(JsMessage.getValue("processclientbo.notcuruser"), new Object[]{arrayOfString[i], str5});
            }
            str1 = (String) localMap.get("node_id");
            ++i;
        }
        return str1;
    }

    private ProcessContext[] _$2(RequestContext paramRequestContext)
            throws WfException {
        TaskInstance[] arrayOfTaskInstance = _$1(paramRequestContext);
        TokenDao localTokenDao = TokenDao.getInstance();
        TaskInstanceDao localTaskInstanceDao = TaskInstanceDao.getInstance();
        ProcessInstanceManager localProcessInstanceManager = ProcessInstanceManager.getInstance();
        String str1 = (String) paramRequestContext.getUserInfo().get("user_id");
        ProcessContext[] arrayOfProcessContext = new ProcessContext[arrayOfTaskInstance.length];
        int i = 0;
        int j = arrayOfTaskInstance.length;
        while (i < j) {
            String str2 = arrayOfTaskInstance[i].getRunState();
            String str3 = arrayOfTaskInstance[i].getTaskId();
            String str4 = localTaskInstanceDao.queryAssignState(str3, str1);
            if ((!(str4.equals("0"))) && (!(str2.equals("0"))))
                throw new WfException(JsMessage.getValue("processclientbo.donot"), new Object[]{arrayOfTaskInstance[i].getTaskId()});
            String str5 = arrayOfTaskInstance[i].getInstanceId();
            ProcessInstance localProcessInstance = localProcessInstanceManager.restoreInstance(str5);
            String str6 = arrayOfTaskInstance[i].getNodeId();
            Token localToken = localTokenDao.restoreToken(str5, str6);
            ProcessContext localProcessContext = new ProcessContext();
            localProcessContext.setToken(localToken);
            localProcessContext.setTaskInstance(arrayOfTaskInstance[i]);
            localProcessContext.setProcessInstance(localProcessInstance);
            localProcessContext.setUserInfo(paramRequestContext.getUserInfo());
            arrayOfProcessContext[i] = localProcessContext;
            ++i;
        }
        return arrayOfProcessContext;
    }

    private TaskInstance[] _$1(RequestContext paramRequestContext)
            throws WfException {
        Map localMap1 = paramRequestContext.getUserInfo();
        if ((localMap1 == null) || (localMap1.isEmpty()))
            throw new WfException(JsMessage.getValue("processclientbo.nouser"));
        String str1 = (String) localMap1.get("user_id");
        Map localMap2 = paramRequestContext.getUserInfo();
        localMap2.put("check_type", paramRequestContext.getRequestValue("check_type"));
        localMap2.put("check_desc", paramRequestContext.getRequestValue("check_desc"));
        localMap2.put("next_nodeid", paramRequestContext.getRequestValue("next_nodeid"));
        localMap2.put("next_userid", paramRequestContext.getRequestValue("next_userid"));
        localMap2.put("next_user", paramRequestContext.getRequestValue("next_user"));
        localMap2.put("deal_desc", paramRequestContext.getRequestValue("deal_desc"));
        localMap2.put("noti_user", paramRequestContext.getRequestValue("noti_user"));
        localMap2.put("noti_userid", paramRequestContext.getRequestValue("noti_userid"));
        TaskInstanceDao localTaskInstanceDao = TaskInstanceDao.getInstance();
        String[] arrayOfString1 = paramRequestContext.getRequestValues("taskid");
        if ((arrayOfString1 != null) && (arrayOfString1.length > 0)) {
            TaskInstance[] localObject1 = new TaskInstance[arrayOfString1.length];
            int i = 0;
            int j = localObject1.length;
            while (i < j) {
                Map localObject2 = localTaskInstanceDao.queryTask(arrayOfString1[i]);
                if (((Map) localObject2).isEmpty())
                    throw new WfException(JsMessage.getValue("processclientbo.notask"), new Object[]{arrayOfString1[i]});
                localObject1[i] = _$1((Map) localObject2, localMap2, localMap1);
                ++i;
            }
            return localObject1;
        }
        Object localObject1 = paramRequestContext.getRequestValue("check_funid");
        String[] arrayOfString2 = paramRequestContext.getRequestValues("keyid");
        if ((arrayOfString2 == null) || (arrayOfString2.length == 0))
            throw new WfException(JsMessage.getValue("processclientbo.noid"));
        String str2 = paramRequestContext.getRequestValue("isforce");
        TaskInstance[] localObject2 = new TaskInstance[arrayOfString2.length];
        int k = 0;
        int l = arrayOfString2.length;
        while (k < l) {
            Map localMap3 = FactoryUtil.newMap();
            if (str2.equals("1")) {
                List localList = localTaskInstanceDao.queryTaskByDataId((String) localObject1, arrayOfString2[k]);
                if (!(localList.isEmpty()))
                    localMap3 = (Map) localList.get(0);
            } else {
                localMap3 = localTaskInstanceDao.queryTaskByAssign((String) localObject1, arrayOfString2[k], str1);
            }
            if (localMap3.isEmpty())
                throw new WfException(JsMessage.getValue("processclientbo.taskend"));
            localObject2[k] = _$1(localMap3, localMap2, localMap1);
            if (str2.equals("1"))
                localObject2[k].setIsForce("1");
            ++k;
        }
        return localObject2;
    }

    private TaskInstance _$1(Map<String, String> paramMap1, Map<String, String> paramMap2, Map<String, String> paramMap3)
            throws WfException {
        TaskInstance localTaskInstance = new TaskInstance();
        localTaskInstance.setProcessId(MapUtil.getValue(paramMap1, "process_id"));
        localTaskInstance.setNodeId(MapUtil.getValue(paramMap1, "node_id"));
        localTaskInstance.setNodeTitle(MapUtil.getValue(paramMap1, "node_title"));
        localTaskInstance.setFunId(MapUtil.getValue(paramMap1, "fun_id"));
        localTaskInstance.setDataId(MapUtil.getValue(paramMap1, "data_id"));
        localTaskInstance.setInstanceId(MapUtil.getValue(paramMap1, "instance_id"));
        localTaskInstance.setTaskId(MapUtil.getValue(paramMap1, "task_id"));
        localTaskInstance.setRunState(MapUtil.getValue(paramMap1, "run_state"));
        localTaskInstance.setStartDate(MapUtil.getValue(paramMap1, "start_date"));
        localTaskInstance.setLimitDate(MapUtil.getValue(paramMap1, "limit_date"));
        localTaskInstance.setEndDate(MapUtil.getValue(paramMap1, "end_date"));
        localTaskInstance.setTaskDesc(MapUtil.getValue(paramMap1, "task_desc"));
        localTaskInstance.setAgreeNum(MapUtil.getValue(paramMap1, "agree_num"));
        localTaskInstance.setHasEmail(MapUtil.getValue(paramMap1, "has_email"));
        localTaskInstance.setNoteType(MapUtil.getValue(paramMap1, "note_type"));
        localTaskInstance.setIsTimeout(MapUtil.getValue(paramMap1, "is_timeout"));
        localTaskInstance.setCheckUserId(MapUtil.getValue(paramMap3, "user_id"));
        localTaskInstance.setCheckUserName(MapUtil.getValue(paramMap3, "user_name"));
        localTaskInstance.setCheckDate(DateUtil.getTodaySec());
        localTaskInstance.setCheckType(MapUtil.getValue(paramMap2, "check_type"));
        localTaskInstance.setCheckDesc(MapUtil.getValue(paramMap2, "check_desc"));
        localTaskInstance.setNextNodeId(MapUtil.getValue(paramMap2, "next_nodeid"));
        localTaskInstance.setNextUserId(MapUtil.getValue(paramMap2, "next_userid"));
        localTaskInstance.setNextUser(MapUtil.getValue(paramMap2, "next_user"));
        localTaskInstance.setDealDesc(MapUtil.getValue(paramMap2, "deal_desc"));
        localTaskInstance.setNotiUser(MapUtil.getValue(paramMap2, "noti_user"));
        localTaskInstance.setNotiUserId(MapUtil.getValue(paramMap2, "noti_userid"));
        return localTaskInstance;
    }

    private Map<String, String> _$1(String paramString1, String paramString2) {
        WfDefineDao localWfDefineDao = WfDefineDao.getInstance();
        return localWfDefineDao.queryProcessByTenant(paramString1, paramString2);
    }
}

package org.jxstar.wf.client;

import org.jxstar.service.BusinessObject;
import org.jxstar.util.config.SystemVar;
import org.jxstar.wf.engine.ProcessContext;
import org.jxstar.wf.engine.ProcessInstance;

import java.util.*;
import java.util.concurrent.*;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class ThreadPoolServerImpl extends BusinessObject {

    private Lock lock = new ReentrantLock();    //锁
    ProcessContext[] processContext;
    String str3;

    public ThreadPoolServerImpl(ProcessContext[] processContext,String str3){
        this.processContext=processContext;
        this.str3=str3;
    }

    /**
     * 执行锁处理
     * @CSDN作者 Nuuuuud
     */
    public boolean performLockProcess() {

        boolean returnBool = true;
        try {
            lock.lock();
            returnBool = new ThreadPoolServerImpl(processContext,str3).allocatingThreadPool();
        } catch (Exception e1) {
            returnBool = false;
            e1.printStackTrace();
        } finally {
            lock.unlock();
        }

        _log.showInfo("执行:" + (returnBool ? "成功" : "失败"));

        return returnBool;
    }

    /**
     * 线程任务分配
     * @CSDN作者 Nuuuuud
     */
    public boolean allocatingThreadPool() throws Exception {

        // 需要的线程池数量
        int threadNum = 17;
        //CountDownLatch latch = new CountDownLatch(threadNum);//线程计数器

        //创建线程池
        ExecutorService executorService = Executors.newFixedThreadPool(threadNum);
        //Future存储执行的线程,便于控制线程状态获取
        List<FutureTask<String>> futures = new ArrayList<FutureTask<String>>(threadNum);

        int excCount = 0;
        for (ProcessContext processContext : processContext) {
            ProcessInstance processInstance = processContext.getProcessInstance();

            //线程需要执行的任务
            ProcessServerImpl iotServerRunnable = new ProcessServerImpl(processInstance,processContext,str3);
            //添加到future控制
            FutureTask<String> future = new FutureTask<String>(iotServerRunnable);
            //线程池执行
            try {
                executorService.submit(future);
            } catch (Exception e) {
                e.printStackTrace();
                return false;
            }
            //添加到List中,后续进行线程状态判断。
            futures.add(future);

            excCount++;
        }

        for (Future<String> future : futures) {
            future.get();
        }

        _log.showDebug("运行次数:" + excCount);
        //关闭线程池
        executorService.shutdown();

        return true;
    }


}

package org.jxstar.wf.client;

import org.jxstar.dao.DaoParam;
import org.jxstar.service.BusinessObject;
import org.jxstar.util.config.SystemVar;
import org.jxstar.wf.engine.ProcessContext;
import org.jxstar.wf.engine.ProcessInstance;
import org.jxstar.wf.engine.TaskInstance;

import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.concurrent.*;

public class ProcessServerImpl extends BusinessObject implements Callable<String> {

    ProcessInstance localProcessInstance;
    ProcessContext processContext;
    String str3;

    //无参构造
    public ProcessServerImpl() {

    }

    //有参构造
    public ProcessServerImpl(ProcessInstance localProcessInstance, ProcessContext processContext, String str3) {
        this.localProcessInstance = localProcessInstance;
        this.processContext = processContext;
        this.str3 = str3;

    }

    /**
     * 此方法执行实际业务
     *
     * @CSDN作者 Nuuuuud
     */
    public String call() throws Exception {
        long startTime = new Date().getTime();
        String str4 = SystemVar.getValue("wf.instance.delay");
        
        localProcessInstance.execute(processContext);
        if ((str4.equals("0")) || (str3.equals("0"))) {
            TaskInstance localTaskInstance = processContext.getTaskInstance();
            localTaskInstance.complete(processContext);
        }

        long endTime = new Date().getTime();
        _log.showDebug("线程【" + Thread.currentThread().getName() + "】执行时间:" + (endTime - startTime) + "毫秒;");

        return null;
    }


}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值