??xml version="1.0" encoding="utf-8" standalone="yes"?>中文字幕一区二区三区四区,久久国产精品免费视频,色狠狠久久aa北条麻妃http://www.aygfsteel.com/fullqin/category/34344.htmlzh-cnTue, 16 Sep 2008 13:38:52 GMTTue, 16 Sep 2008 13:38:52 GMT60【原】通过jbpm源码分析jbpm引擎内核工作原理http://www.aygfsteel.com/fullqin/archive/2008/09/16/229236.html囧囧之猪囧囧之猪Tue, 16 Sep 2008 11:28:00 GMThttp://www.aygfsteel.com/fullqin/archive/2008/09/16/229236.htmlhttp://www.aygfsteel.com/fullqin/comments/229236.htmlhttp://www.aygfsteel.com/fullqin/archive/2008/09/16/229236.html#Feedback0http://www.aygfsteel.com/fullqin/comments/commentRss/229236.htmlhttp://www.aygfsteel.com/fullqin/services/trackbacks/229236.html        JbpmQ他是jboss下的一个开源项目,是个Zpetri net理论为基的工作流引擎。本文主要通过jbpm源代码分析下jbpm引擎内核工作原理?br />         Jbpm是基于微内核引擎的基上扩展开发出来的工作^収ͼ其运行的核心包是在org.jbpm.graph下,在该包下又分有action、def、exe、log、node几个包,jbpm内核引擎实现逻辑主要存放在def、exeq两个包下,其他的包是基于此内核扩展出来的动作、模型和日志?br />         下面我们通过一个简单的例子来逐步的分析jbpm是如何工作的。看下面jbpm自带演示的一个hello程Q视乎大安喜欢从hello实现开始^_^Q,代码如下Q?br />         public void testHelloWorldProcess() {
                ProcessDefinition processDefinition = ProcessDefinition.parseXmlString(
                "<process-definition>" +
                " <start-state>" +
                " <transition to='s' />" +
                " </start-state>" +
                " <state name='s'>" +
                " <transition to='end' />" +
                " </state>" +
                " <end-state name='end' />" +
                "</process-definition>"
                );

                ProcessInstance processInstance =new ProcessInstance(processDefinition);
                Token token = processInstance.getRootToken();
                assertSame(processDefinition.getStartState(), token.getNode());
                token.signal();
                assertSame(processDefinition.getNode("s"), token.getNode());
                token.signal();
                assertSame(processDefinition.getNode("end"), token.getNode());
        }
        首先Q我们定义个程模板QProcessDefinitionQ,是上面代码的ProcessDefinition processDefinition = ProcessDefinition.parseXmlString(….);q段Q在括号中是jbpm定义的流E,其中包括三个环节Q分别是starts-state、state和end-state。parseXmlStringQ)Ҏ的主要功能是解析q段xml语言q回个流E模板对象(processDefinitionQ?br />         接着Q通过程实例c(ProcessInstanceQ来实例化个程实例Q通过传进来的程模板对象创徏ProcessInstance processInstance =new ProcessInstance(processDefinition)。我们来看看new ProcessInstance(processDefinition)到底做了什么,通过查看ProcessInstance的源代码Q可以看到其中主要的一D|
        public ProcessInstance( ProcessDefinition processDefinition ) {
            //略去其他代码
            this.processDefinition = processDefinition; //流E模板对象付l流E实?br />             this.rootToken = new Token(this); //创徏跟o?br />             //略去其他代码
        }
        我们l箋跟进Tokenq个c?br />         public Token(ProcessInstance processInstance) {
            //主要一句如?br />             this.node = processInstance.getProcessDefinition().getStartState();
        }
        q样实C令牌l定到开始节炏V至此,一个流E实例就创徏h了,q且该流E实例走C开始节点,即o牌所处的位置?br />         我们接着往下走token.signal()
        public void signal() {
                signal(node.getDefaultLeavingTransition(), new ExecutionContext(this));
                //q里的getDefaultLeavingTransition()如果有多条\径,则去W一条\?br />           }
        void signal(Transition transition, ExecutionContext executionContext) {
            //省略其他代码
            node.leave(executionContext, transition);
            //省略其他代码
        }
        q里的node是刚才令牌所在的开始节点,我们来看看jbpm是如何将令牌从开始节点移C个节点的?br />         public void leave(ExecutionContext executionContext, Transition transition) {
            Token token = executionContext.getToken();
            token.setNode(this);//此时令牌q在开始节?br />             executionContext.setTransition(transition);
            //略去部分代码
        executionContext.setTransitionSource(this);
        transition.take(executionContext);//实现令牌的{U?br />         }
        我们来看看transition.take(..)Ҏ做了什?br />         public void take(ExecutionContext executionContext) {
            //略去部分代码
            to.enter(executionContext);//d开始节点,q入C个节?br />         }
        大家可能会有点疑问,q个to节点是什么是否初始化的?其实在signal时有句node.getDefaultLeavingTransition()Q这句返回Transition对象Q该对象已l初始化了to节点的对象。我们在跟进to.enter(..)
        public void enter(ExecutionContext executionContext) {
            Token token = executionContext.getToken();
            token.setNode(this);//此时令牌到了名字ؓ“s”的state节点
            token.setNodeEnter(new Date());
            executionContext.setTransition(null);
            executionContext.setTransitionSource(null);
            execute(executionContext);
        }
        在这D代码中的注释这句,真正实现了o牌从开始节点到下个节点了?br />         xQjbpm工作引擎的内部工作原理׃l完了,其实q就是工作流引擎最核心的部分了Q就是如何从一个环节{Ud另一个环节。或怽会说“q么单,我马上就可以写一?#8221;Q其实不Ӟ上面我们所用的例子是十分简单的例子Q其实在工作联盟规范中q有其他复杂的节Ҏ型,如splitQjoinQsubflow{。不q幸q的是这些复杂的节点模型jbpm都ؓ我们提供了他自己的默认的实现Q这些节Ҏ型都在org.jbpm.graph.node包下。jbpm引擎中很好的抽象了节Ҏ型Nodec,大部分的复杂节点模型都承自NodeQ我们也可以定制自己的节点,只要实现Nodecȝexecute()Ҏ卛_方便的实现。其实从上面分析的代码可以看出,NodecM要的逻辑处理是在leave()、enter()和execute()三个ҎQ大家可以看下ProcessStateQjoinQforkq些节点模型是如何实现的?br /> 以上单介l了jbpm引擎内核的工作原理,如有不对的地方还望指正?br />



囧囧之猪 2008-09-16 19:28 发表评论
]]>
从基于db的workflow转战到jbpmhttp://www.aygfsteel.com/fullqin/archive/2008/09/15/229013.html囧囧之猪囧囧之猪Mon, 15 Sep 2008 10:21:00 GMThttp://www.aygfsteel.com/fullqin/archive/2008/09/15/229013.htmlhttp://www.aygfsteel.com/fullqin/comments/229013.htmlhttp://www.aygfsteel.com/fullqin/archive/2008/09/15/229013.html#Feedback0http://www.aygfsteel.com/fullqin/comments/commentRss/229013.htmlhttp://www.aygfsteel.com/fullqin/services/trackbacks/229013.html    开始接触工作流是两q前Q那时刚q公司,自己也算是个新手Q到公司后被分配到做IT|管的项目组Q做了些东西Q后来成立了个新的项目组Q我被分配到q个新组成的目l,也就是从q以后开始接触工作流的。当时对工作是一Ҏ念都没有Q慢慢从公司开发的Zdb的工作流q_开始接触工作流QƈZ此工作流q_l合业务开发了几个模块?br />     公司的这个基?/span>db的工作流q_q是实现了许多功能:
        1、基?/span>web的流E设计器Q主要是ZIE?/span>vml语言开发的Q可以设计出如下囄程模板?br />
    此流E模板包括开始环节,l束环节以及人工处理的两个环节(专家l处理和发v人确认)Q实现环节的自@环以及回朔,分别?#8220;专家l处?#8221;环节?#8220;发v人确?#8221;环节上实现。基于此程q行中的实例囑֦下:


    2、环节的扭{
    A、串?br />     像上图中介绍的就是实C串行的功能?br />     B、ƈ?/span>如图

    C、多实例Q即q_所说的会签Q?br />     实现了包括所有会{N完成后才往下个环节走和几个会签后就可往下个环节走的功能Q流E的模板如图Q?br />
    其中环节模板上带“M”的环节就表示是多实例的环节?br />     q行中的实例如图Q?br />
    D、子程子流E是在一个虚拟环节中实现的,卌环节不是人工环节。如图:

    基本上一个简单的工作^台的功能都差不多实现了,不过在用过E中q是发现了许多的弊端Q毕竟系l的逻辑大部分是Z数据库函数实现的Q这使得大部分的逻辑都要依赖于数据库Q而外围的一些基?/span>java的逻辑实现比较难实现了,举个例子Q在和外pȝ做接口时Q当某个环节竣工后要向外pȝ发信息,而信息是通过url的方式传递的Q这个用java实现是很Ҏ的,而用数据库函数就无法直接实现了(据目前自己掌握的技术判断,不知是否有办法实玎ͼ望知道者告知)Q现在变通的一个做法是在数据库里保存信息,然后通过quartz定时的扫描该表,有数据则通过httpclientl外pȝ发送信息。还有模型本w只有开始环节,l束环节Q虚拟环节和人工执行环节Q得客h的要按业务\q功能无法实CQ因为缺个判断环节模板Q就?/span>jbpm中的decision环节模板Q所以在创徏下个环节的时候大部分都是Zؓ的主观去判断到底是走上图中的“Ҏ审核”q是“d分配”环节。这使得q用程整合业务逻辑时ƈ没有完全的实现流E的自动化?br />     其实q有很多的缺P只是我们都是通过变相的方式给予了实现Q可是客h些需求在该^Cq是无法实现的。鉴于此Q就开始寻扑ּ源的工作引擎,?/span>osworkflow?/span>jbpm?/span>shark{的开源工作流引擎中选择?/span>jbpm。ؓ什么会选择jbpm呢?原因q是蛮多的,具体列出几条如下几条Q?br />     1?nbsp;Zpetri net理论实现的工作流?br />     2?nbsp;引擎核心以微内核的方式实玎ͼ主要逻辑都在graph包下Q?br />     3?nbsp;Zhibernate实现持久化?br />     4?nbsp;很容易的?/span>spring实现整合Q通过spring-modules实现整合?br /> {。最后附上一个最复杂的流E图Q像蜘蛛|更贴切^_^Q?br />  

囧囧之猪 2008-09-15 18:21 发表评论
]]>
վ֩ģ壺 ʳ| Զ| β| | | ƽ| пѷ| | | | | | | | | | | Զ| Ϸ| | ƽ½| ɽ| | | | | Ǩ| | | | ͨ| ˮ| | | ͭɽ| | ӳ| | | ͨ| |