流程处理核心代码

import java.util.HashMap;

/**
 * 每一个流程的全局上下文(静态内部类实现的单例)
 *
 * @author zhangfan on 2018/1/30.
 */
public class FlowGlobalContext {
    private ThreadLocal nodeToShareData;

    private static class GlobalContextHolder {
        private static final FlowGlobalContext INSTANCE = new FlowGlobalContext();
    }

    private FlowGlobalContext() {
        nodeToShareData = new ThreadLocal();
        nodeToShareData.set(new HashMap<String,Object>());
    }

    public static final FlowGlobalContext getInstance() {
        return GlobalContextHolder.INSTANCE;
    }

    public ThreadLocal getNodeToShareData(){
        return nodeToShareData;
    }
}
----------------------------------------------------------------------------
 
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import org.springframework.util.Assert;

/**
 * 单例工厂(单例、单例注册表)
 *
 * @author zhangfan on 2018/1/31.
 */
public class AbstractSingleBeanFactory {
    /**
     * 充当了Bean实例的缓存,实现方式和单例注册表相同
     */
    private final Map singletonCache;

    private AbstractSingleBeanFactory() {
        singletonCache = new ConcurrentHashMap(256);
    }

    private static class AbstractBeanFactoryHolder {
        private static final AbstractSingleBeanFactory INSTANCE = new AbstractSingleBeanFactory();
    }

    public static AbstractSingleBeanFactory getInstance() {
        return AbstractBeanFactoryHolder.INSTANCE;
    }

    public Object getBean(String name) throws Exception{
        Assert.notNull(name, "'name' must not be null");
        Object bean = this.singletonCache.get(name);
        // A与B线程同一时刻执行到该地方
        if (bean == null) {
            //使用了代码锁定同步块,原理和同步方法相似,但是这种写法效率更高
            // A与B线程同一时刻执行到这
            synchronized (this.singletonCache) {
                // A运气好先执行,B在等待,A处理完毕,会在集合中有name相关的实例,然后B结束等待,进入此代码,而此时集合中
                // 有A线程执行后放入的实例。所以下面需要再次判断,防止B线程多new 一个实例出来。
                if (bean == null) {
                    bean = this.singletonCache.get(name);
                    if (bean == null) {
                        bean = Class.forName(name).newInstance();
                        this.singletonCache.put(name, bean);
                        return bean;
                    }
                }
            }
        }
        return bean;
    }
}

------------------------------------------------------------------------------

 
import com.wdk.finance.enums.BizTypeEnum;
import com.wdk.finance.node.flow.AbstractProcessFlow;
import com.wdk.finance.node.factory.bean.AbstractSingleBeanFactory;

/**
 * 流程工厂
 *
 * @author zhangfan on 2018/1/27.
 */
public class FlowFactory {
    /**
     * 
     * @param bizType
     * @return
     */
    public AbstractProcessFlow getProcessFlow(String bizType) throws Exception {
        if (bizType == null) {
            return null;
        }
        if (String.valueOf(4).equals(bizType)) {
            return (AbstractProcessFlow)AbstractSingleBeanFactory.getInstance().getBean("com.wdk.finance.node.flow.PerformanceInvoiceProcessFlow");
        }
        return null;
    }
}

 

 

 

------------------------------------------------------------------------------
import com.wdk.finance.node.AbstractNode;

/**
 *
 *
 * @author zhangfan on 2018/1/26.
 */
public class A extends AbstractNode {

    @Override
    public void execute() throws Exception {

    }
}

 

 

 

------------------------------------------------------------------------------
import com.wdk.finance.node.AbstractNode;

/**
 * 
 *
 * @author zhangfan on 2018/1/25.
 */
public class B extends AbstractNode {

    @Override
    public void execute() throws Exception {

    }
}

 

 

 

------------------------------------------------------------------------------
 
import com.wdk.finance.node.AbstractNode;
import com.wdk.finance.node.context.FlowGlobalContext;

/**
 * 流程完毕移除该流程线程的参数值
 *
 * @author zhangfan on 2018/1/30.
 */
public class RemoveThreadLocalValue extends AbstractNode {
    @Override
    public void execute() throws Exception {
       FlowGlobalContext.getInstance().getNodeToShareData().remove();
    }
}

 

 

 

 

 

------------------------------------------------------------------------------
import java.util.ArrayList;
import java.util.List;

import com.wdk.finance.node.AbstractNode;

/**
 * 抽象的处理流程
 *
 * @author zhangfan on 2018/1/27.
 */
public abstract class AbstractProcessFlow implements Flow {
    List<AbstractNode> flowCombinations = new ArrayList<>();
}

 

 

 

------------------------------------------------------------------------------
import java.util.List;

import com.wdk.finance.node.AbstractNode;

/**
 * 流程接口
 *
 * @author zhangfan on 2018/1/27.
 */
public interface Flow {
    /**
     * 获取流程组合
     *
     * @return
     */
    public List<AbstractNode> getFlowCombination() throws Exception;
}

 

 

 

------------------------------------------------------------------------------
import java.util.List;
import com.wdk.finance.node.AbstractNode;
import com.wdk.finance.node.factory.bean.AbstractSingleBeanFactory;

/**
 * 履约单据处理流程
 *
 * @author zhangfan on 2018/1/27.
 */
public class PerformanceInvoiceProcessFlow extends AbstractProcessFlow{
    @Override
    public List<AbstractNode> getFlowCombination() throws Exception {
        flowCombinations.add((AbstractNode)AbstractSingleBeanFactory.getInstance().getBean("com.wdk.finance.node.flow.biz.A"));
        flowCombinations.add((AbstractNode)AbstractSingleBeanFactory.getInstance().getBean("com.wdk.finance.node.flow.biz.B"));
        flowCombinations.add((AbstractNode)AbstractSingleBeanFactory.getInstance().getBean("com.wdk.finance.node.flow.biz.RemoveThreadLocalValue"));
        return flowCombinations;
    }
}

 

 

 

------------------------------------------------------------------------------
public class MySingleton {
    private static class MySingletonHandler {
        private static MySingleton instance = new MySingleton();
    }

    private MySingleton() {}

    public static MySingleton getInstance() {
        return MySingletonHandler.instance;
    }
}

 

 

 

------------------------------------------------------------------------------
import com.wdk.finance.node.NodeHandler;
import com.wdk.finance.node.factory.bean.AbstractSingleBeanFactory;
import com.wdk.finance.node.factory.flow.FlowFactory;

/**
 * @author zhangfan on 2018/1/31.
 */
public class NodeTest {
    public static void main(String[] args) throws Exception {
        FlowFactory flowFactory = (FlowFactory)AbstractSingleBeanFactory.getInstance().getBean("com.wdk.finance.node.factory.flow.FlowFactory");
        NodeHandler nodeHandler = (NodeHandler)AbstractSingleBeanFactory.getInstance().getBean("com.wdk.finance.node.NodeHandler");
        try {
            nodeHandler.handlerNode(flowFactory.getProcessFlow("4"));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

 

 

 

------------------------------------------------------------------------------
import com.wdk.finance.node.factory.bean.AbstractSingleBeanFactory;

/**
 * 测试多线程环境下,AbstractSingleBeanFactory创建的对象单例,是否正确
 *
 * @author zhangfan on 2018/2/1.
 */
public class TestAbstractSingleBeanFactory extends Thread {
    @Override
    public void run() {
        try {
            while (true){
                System.out.println(
                    AbstractSingleBeanFactory.getInstance().getBean("com.wdk.finance.node.NodeHandler").hashCode());
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        // 测试多线程下的
        TestAbstractSingleBeanFactory[] mts = new TestAbstractSingleBeanFactory[1000];
        for (int i = 0; i < mts.length; i++) {
            mts[i] = new TestAbstractSingleBeanFactory();
        }

        for (int j = 0; j < mts.length; j++) {
            mts[j].start();
        }
    }
}
------------------------------------------------------------------------------
 
import com.wdk.finance.node.context.FlowGlobalContext;

/**
 * 测试多线程环境下的静态内部类实现的单例
 */
public class TestThreadLocal extends Thread{
      
    @Override  
    public void run() {
        FlowGlobalContext.getInstance().getNodeToShareData().set(1);
        while (true){
            FlowGlobalContext globalContext = FlowGlobalContext.getInstance();
            ThreadLocal threadLocal = globalContext.getNodeToShareData();
            Integer i = (Integer)threadLocal.get();
            System.out.println(Thread.currentThread().getName()+","+i);
            if(null != i){
                i++;
            }
            threadLocal.set(i);
            try {
                Thread.sleep(3000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
      
    public static void main(String[] args) {
        // 测试多线程下的
        TestThreadLocal[] mts = new TestThreadLocal[5];
        for(int i = 0 ; i < mts.length ; i++){
            mts[i] = new TestThreadLocal();
        }

        for (int j = 0; j < mts.length; j++) {
            mts[j].start();
        }
    }  
}  

 

------------------------------------------------------------------------------

 

 
import java.util.Map;

import com.wdk.finance.node.context.FlowGlobalContext;

/**
 * 流程相关的全局上下文工具类
 *
 * @author zhangfan on 2018/2/1.
 */
public class FlowGlobalContextUtils {

    /**
     * 添加值到全局map里面
     *
     * @param key
     * @param value
     */
    public static void put(String key, Object value) {
        ((Map<String, Object>)FlowGlobalContext.getInstance().getNodeToShareData().get()).put(key, value);
    }

    /**
     * 从全局map里面取值
     *
     * @param key
     */
    public static Object get(String key) {
        return ((Map<String, Object>)FlowGlobalContext.getInstance().getNodeToShareData().get()).get(key);
    }
}

 

------------------------------------------------------------------------------

 

 
import java.util.Map;
import com.wdk.finance.node.context.FlowGlobalContext;

/**
 * 抽象节点(单例模式)
 *
 * @author zhangfan on 2018/1/25.
 */
public abstract class AbstractNode implements Node {
    /**
     * 节点共享数据
     */
    protected Map<String, Object> nodeToShareData;

    /**
     * 外部调用(模板方法)
     * @return
     * @throws Exception
     */
    protected void invoke() throws Exception {
        beforeExecute();
        execute();
    }

    /**
     * 执行目标方法之前
     *
     * @return
     * @throws Exception
     */
    public void beforeExecute()throws Exception{
        // 获取节点共享的数据
        this.nodeToShareData = (Map<String, Object>)FlowGlobalContext.getInstance().getNodeToShareData().get();
    }
}

 

------------------------------------------------------------------------------

 

 
/**
 * 抽象的节点接口
 *
 * @author by zhangfan on 2018/1/25.
 */
public interface Node {
    /**
     * 执行目标方法
     *
     * @return
     * @throws Exception
     */
    public void execute() throws Exception;
}

 

------------------------------------------------------------------------------

 

 
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import com.wdk.finance.node.context.FlowGlobalContext;
import com.wdk.finance.node.flow.AbstractProcessFlow;

/**
 * 抽象的节点处理者
 *
 * @author zhangfan on 2018/1/25.
 */
public class NodeHandler {
    public void handlerNode(AbstractProcessFlow abstractProcessFlow) throws Exception{
        // 默认都要执行下一个节点
        ((Map<String, Object>)FlowGlobalContext.getInstance().getNodeToShareData().get()).put("nodeResult", true);
        List<AbstractNode> abstractNodes = abstractProcessFlow.getFlowCombination();
        try{
            Iterator abstractNodesIterator = abstractNodes.iterator();
            while (abstractNodesIterator.hasNext()){
                AbstractNode abstractNode = (AbstractNode)abstractNodesIterator.next();
                abstractNode.invoke();
                // 判断是否要继续执行下一个节点
                if (!((Boolean)abstractNode.nodeToShareData.get("nodeResult"))) {
                    if(abstractNodes.size()>1){
                        abstractNodes.get(abstractNodes.size()-1).invoke();
                    }
                    break;
                }
            }
        }catch (Exception e){
            if(abstractNodes.size()>1){
                abstractNodes.get(abstractNodes.size()-1).invoke();
            }
            throw e;
        }
    }
}
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
工作流程引擎. 运行环境: BS结构. windows xp, windows server. win7 IIS6.0以上. .net4.0. Office2007 (如果需要单据打印.) 开发语言: VS2010, .net4.0 c#.net. 客户端: FireFox 3.0以上. IE7+,或者使用IE内核的浏览器. 组成部分: 流程图形设计器(有:cs版本与bs版本)/流程前台运行程序(BS结构)/流程服务(CS)/web的方式的表单设计器/BRP工具 基本功能: 图形化流程设计/智能表单web定义免程序开发/级联下拉框/流程轨迹/单据自定义打印/邮件短信工作到达通知/自动任务分配/支持sdk模式开发/简洁集成/消息侦听/丰富事件接口/报表定义/工作量分析/绩效考核/手机访问/支持sqlserve,oracle,mysql,access数据库 CCFlow功能: 懂管理就会开发基本流程,为单位流程管理系统,会SQL就能达到中级开发水平解决复杂的逻辑问题与其它系统耦合,有程基础就可以使用sdk做高级的开发. 程序运行组件清单. ***************************************************************** 1. .net 4.0 2, owc11.exe 用于生成数据图形分析。 3, SaveAsPDFandXPS.exe 生成pdf文件的组件.【选装】 4, iewebcontrols.msi 控件. 5, vs2010 开发环境(不进行二次开发不必要安装) ***************************************************************** ccflow 开源程序文件清单: ***************************************************************** 组件目录 D:\ccflow\Components 组件目录. D:\ccflow\Components\BP.En30 -- 底层基类. D:\ccflow\Components\BP.Web.Controls30 --bs控件层. D:\ccflow\Components\BP.WFV4 --工作流程引擎层 D:\ccflow\Components\BP.Win32.Controls --cs控件层. D:\ccflow\DLL -- 第三方组件中需要调用dll. D:\ccflow\Documents - 文档 D:\ccflow\VisualFlow --bs工作流程引擎前台. D:\ccflow\VisualWorkFlowServices - 流程服务程序. D:\ccflow\VisualFlowWebDesigner - silverlight流程设计器. D:\ccflow\CCFlowWord2007 - VSTO公文流程. D:\ccflow\ExpandingApplication 行业应用通用代码。 D:\ccflow\Tools 工具 关于: ccflow前台目录结构. D:\ccflow\VisualFlow\Comm --通用功能层. D:\ccflow\VisualFlow\Data -- 应用程序数据目录. 包含一些xml,等等。 D:\ccflow\VisualFlow\Data\Install 与安装有关系的文件 D:\ccflow\VisualFlow\Data\JSLib 系统javascript 函数库。 D:\ccflow\VisualFlow\Data\Language 语言包(完善中) D:\ccflow\VisualFlow\Data\Node cs流程设计器节点类型(cs流程设计器不在发展) D:\ccflow\VisualFlow\Data\XML xml配置文件不仅仅ccflow使用,bp框架也使用它。 用户数据目录。 D:\ccflow\VisualFlow\DataUser -- 用户数据目录。 D:\ccflow\VisualFlow\DataUser\Bill 单据打印生成数据. D:\ccflow\VisualFlow\DataUser\CyclostyleFile 单据模板数据 D:\ccflow\VisualFlow\DataUser\DtlTemplete 导入明细表模板文件. D:\ccflow\VisualFlow\DataUser\EmailTemplete 自定义邮件发送格式文件. D:\ccflow\VisualFlow\DataUser\JSLib 用户自定义函数库 D:\ccflow\VisualFlow\DataUser\JSLibData 用户自定义函数生成文件。 D:\ccflow\VisualFlow\DataUser\Log 系统日志文件 D:\ccflow\VisualFlow\DataUser\ReturnLog 退回日志文件. D:\ccflow\VisualFlow\DataUser\Siganture 签名文件. D:\ccflow\VisualFlow\DataUser\Style 用户自定义风格文件。 D:\ccflow\VisualFlow\DataUser\UploadFile 表单附件上传文件,单附件,与多附件。 D:\ccflow\VisualFlow\DataUser\XML 用户系统配置文件。 D:\ccflow\VisualFlow\WF\DocFlow -- 公文流程(目前还不是很完善) D:\ccflow\VisualFlow\OA -- 通用oa 组件(目前还不是很完善) D:\ccflow\VisualFlow\SDKFlowDemo -- sdk开发模式的案例. D:\ccflow\VisualFlow\WF\WAP -- 手机访问前台代码目录. (说明:对C级用户有效) D:\ccflow\VisualFlow\WF -- ccflow前台应用程序层(主要的功能都是在这个目录里面) D:\ccflow\VisualFlow\WF\Admin - 对ccflow的管理比如设计方向条件.报表定义... D:\ccflow\VisualFlow\WF\MapDef - 表单定义. D:\ccflow\VisualFlow\ClientBin - silverlight 程序.。 CCFlowDesigner.xap流程设计器,CCForm.xap表单设计器。 注意: 源码有详细使用文档,可以下载查看。 管理员用户名是:admin 密码是 pub 默认添加的用户的密码均是pub

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值