<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>gabriel</title>
    <description></description>
    <link>http://gabriel80.javaeye.com</link>
    <language>UTF-8</language>
    <copyright>Copyright 2003-2008, JavaEye.com</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>JavaEye - 做最棒的软件开发交流社区</generator>
      <item>
        <title>新的一天</title>
        <author>gabriel80</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://gabriel80.javaeye.com">gabriel80</a>&nbsp;
          链接：<a href="http://gabriel80.javaeye.com/blog/179966" style="color:red;">http://gabriel80.javaeye.com/blog/179966</a>&nbsp;
          发表时间: 2008年04月07日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          清明节过完了，又是新的一天了。<br />开始努力了
          <br/>
          <span style="color:red;">
            <a href="http://gabriel80.javaeye.com/blog/179966#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 07 Apr 2008 08:46:02 +0800</pubDate>
        <link>http://gabriel80.javaeye.com/blog/179966</link>
        <guid>http://gabriel80.javaeye.com/blog/179966</guid>
      </item>
      <item>
        <title>JAVA的由来</title>
        <author>gabriel80</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://gabriel80.javaeye.com">gabriel80</a>&nbsp;
          链接：<a href="http://gabriel80.javaeye.com/blog/178804" style="color:red;">http://gabriel80.javaeye.com/blog/178804</a>&nbsp;
          发表时间: 2008年04月02日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          SUN公司在1991年准备开发一个机顶盒的项目，那时候电视都是广播式（broadcast）的。即电视台发送节目给用户，用户只能被动的接收，不能点播自己喜欢的节目。SUN公司就想为用户实现一个能点播的装置，此装置将用户的请求发送到电视台，电视台再将节目发送给用户。SUN公司给开发机顶盒的这个小组一栋别墅，他们在这里开发项目。此小组还有一个名字“start seven”,名字的由来是这样的：这个别墅的电话可以打进来并能接听，但是只有按下start和seven之后才能让对方听见自己说话。美国人起名字就是这么有意思。不会想中国人起名字时还要看看风水什么的。<br /><br />这个装置能够转发用户的请求，那么这里面应该有一个芯片。小组考虑到开发出来需要2-3年的时间，要是到时候没有芯片了怎么办？这个问题是IBM在芯片8096上让广大开发商引起足够重视的。IBM的51芯片取得了很大的成功，这种芯片是8位的，后来IBM生产了16位的8096芯片，性能比51更优越，许多开发商开始开发基于8096的产品，当各大开发商万事俱备就等IBM的8096芯片时，IBM突然说他不再生产这种芯片了，使这些开发商损失很大。以后开发商都把这个问题列在开发产品时的必须考虑在内的问题。James Gosling提出了一个建议：开发一个解释器，设计一种语言，解释器负责执行这种语言，而解释器可以根据不同的芯片设计。这样就使得开发工作的开始就不用硬件参与，这种解释器可以先在SUN的Solaris平台上运行，等开发完成后，再在要使用的芯片上设计一种解释器就可以了。三年之后的1994年，这种机顶盒设计出来了，那种语言叫做OAK（橡树，别墅旁边有一棵橡树，James Gosling每天早上起来都能看到它，所以命名OAK）。但等到SUN公司向电视台推销这种产品的时候，电视台的老总不认可这种装置。SUN的这个项目只能以失败告终。可项目小组的这些人不干啊，他们在别墅里郁闷了三天，同样是James Gosling想到了HTML语言可以在各种浏览器里运行，可不可以把他们的种语言嵌入浏览器里，让浏览器不仅仅是显示静态页面，还能够执行程序。在SUN公司同意后，这些人继续玩他们的“ 游戏”。<br /><br />1995年，SUN公司和好莱坞准备开展一个技术交流会，皆以宣传公司的产品。在离技术交流会还有7天的时候，交流会的负责人在SUN总部遇到了James Gosling，问他是不是也参加这个技术交流会，但是他们的系统还有1000个bug，最后James Gosling还是同意了。经过7天的奋斗，James Gosling带着他的系统来到了技术交流会。但他不能用OAK这个名字了。OAK已经被一家半导体公司注册了，并且主册了好多领域，只能换名。James Gosling又四处观望寻找灵感，他看到了一个泡咖啡的杯子，杯子上印着Java（印度尼西亚的爪洼岛，以生产咖啡著名），James Gosling就把这种语言改名为Java，这个词并不是英语。浏览器叫做HotJava。他托个一个小球在浏览器里移动，打动了在场的所有观众。网景公司找到了SUN公司，想把Java语言嵌入他们的Netspace浏览器，不要再使用HotJava浏览器，当时Netspace浏览器在市场上占据95%。1995年5月23日，SUN宣布Java语言正式诞生，自此5月23日成了Java的生日。
          <br/>
          <span style="color:red;">
            <a href="http://gabriel80.javaeye.com/blog/178804#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 02 Apr 2008 13:44:58 +0800</pubDate>
        <link>http://gabriel80.javaeye.com/blog/178804</link>
        <guid>http://gabriel80.javaeye.com/blog/178804</guid>
      </item>
      <item>
        <title>线程和进程的区别</title>
        <author>gabriel80</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://gabriel80.javaeye.com">gabriel80</a>&nbsp;
          链接：<a href="http://gabriel80.javaeye.com/blog/178473" style="color:red;">http://gabriel80.javaeye.com/blog/178473</a>&nbsp;
          发表时间: 2008年04月01日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          进程和线程都是由操作系统所体会的程序运行的基本单元，系统利用该基本单元实现系统对应用的并发性。<br />进程（Process）和线程（Thread）的区别在于：<br /><br />    线程的划分尺度小于进程，使得多线程程序的并发性高。<br />    线程在执行过程中与进程还是有区别的。每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行，必须依存在应用程序中，由应用程序提供多个线程执行控制。<br /><br />    进程是指在系统中正在运行的一个应用程序；线程是系统分配处理器时间资源的基本单元，或者说进程之内独立执行的一个单元。对于操作系统而言其调度单元是线程。一个进程至少包括一个线程，通常将该线程称为主线程。一个进程从主线程的执行开始进而创建一个或多个附加线程，就是所谓基于多线程的多任务<br /><br />   进程与线程的重要区别在于线程不能够单独执行，它必须运行在处于活动状态的应用程序进程中
          <br/>
          <span style="color:red;">
            <a href="http://gabriel80.javaeye.com/blog/178473#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 01 Apr 2008 16:20:31 +0800</pubDate>
        <link>http://gabriel80.javaeye.com/blog/178473</link>
        <guid>http://gabriel80.javaeye.com/blog/178473</guid>
      </item>
      <item>
        <title>工作流管理系统（WfMS）介绍</title>
        <author>gabriel80</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://gabriel80.javaeye.com">gabriel80</a>&nbsp;
          链接：<a href="http://gabriel80.javaeye.com/blog/178346" style="color:red;">http://gabriel80.javaeye.com/blog/178346</a>&nbsp;
          发表时间: 2008年04月01日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          1.3	工作流管理系统<br />1.3.1.	概述：<br />即Workflow Management System，简称WFMS，是定义、创建、执行工作流的系   统。工作流管理系统为方便业务交互逻辑、业务处理逻辑以及参与者的修改，多数通过提 供可视化的流程设计器以及表单设计器来实现，为实现工作流管理系统的扩展性。<br />1.3.2.	定义：<br />一个软件应用程序，它存储流程定义并通过其工作流引擎组件来根据这些流程定义运行工作。工作流引擎是运行时执行模块<br />1.3.3.	WfMS的接口：<br />	定义接口：允许流程开发人员部署流程定义；这里的“流程开发人员”是业务分析师和软件开发人员的组合<br />	执行接口：使用户和系统可以操作流程实例；流程实例是流程定义的执行；流程定义的控制流通过状态机描述；执行接口的两个主要方法是启动一个流程实例和通知工作流系统一个状态的结束<br />	应用程序接口：表示由工作流系统发起的工作流系统和外部系统之间的交互。当用户或系统管理一个流程实例的运行时，会产生事件；流程定义中可以指定一段响应事件的可执行代码逻辑，程序代码能够和组织内外部的其他系统通信<br />	监控接口：管理人员通过监控接口获得流程运行记录的统计数据；有时，运行记录也可用于跟踪审计<br />1.4	工作流引擎<br />英文全称是：WorkFlow Engine，是指workflow作为应用系统的一部分，并为之提供对各应用系统有决定作用的根据角色、分工和条件的不同决定信息传递路由、内容等级等核心解决方案。工作流引擎的几个要素有：<br />1.4.1.	实体(Entity) <br />是工作流的主体，是需要随着工作流一起流动的物件(Object)。例如，在一个采购申请批准流程中，实体就是采购申请单；在公文审批流程中，实体就是公文<br />1.4.2.	参与者(Participant)<br />是各个处理步骤中的责任人，可能是人，也可能是某个职能部门，还可能是某个自动化的设备<br />1.4.3.	流程定义(Flow Definition) <br />是预定义的工作步骤，它规定了实体流动的路线。它可能是完全定义的，即对每种可能的情况都能完全确定下一个参与者，也可能是不完全定义的，需要参与者根据情况决定下一个参与者； <br />1.4.4.	工作流引擎(Engine) <br />是驱动实体按流程定义从一个参与者流向下一个参与者的机制<br /><br /><br />流程定义的四个层次<br /><br /> 流程定义的内容可以分为四个不同的层次：状态（state）、上下文（context）、程序逻辑（programming logic）和用户界面（UI）<br /><br />l         状态层<br /><br />Ø         所有的状态表述和控制流属于业务流程的状态层；<br /><br />Ø         标准程序语言的控制流定义了必须被执行的指令的顺序，由我们书写的命令、if语句、循环语句等确定；业务流程中的控制流基本相同，但使用基本元素替代指令；业务流程中的基本元素是状态；<br /><br />Ø         在流程中，状态(或等待状态)指定一种对外部参与者的依赖；状态的意思就像“现在X系统或Y人必须做某些事，在此等待直到参与者通知任务已完成的外部触发”；<br /><br />Ø         流程定义中的状态也指定了执行依赖于哪个参与者；WfMS使用代表参与者的名字的信息构建任务列表，这是WfMS的通用特性；对于需要人参与的状态，WfMS必须在运行时计算出具体人，这样的计算使WfMS必须依赖于组织结构信息；<br /><br />Ø         流程定义的控制流是一组和结合状态之间关系的状态；<br /><br />Ø         状态之间的逻辑指定哪些执行路径可以并发执行，那些是排它的；并发执行路径用交叉和联合来建模，而排它执行路径用判断和合入来建模；<br /><br />Ø         UML活动图经常被用来做业务流程建模；<br /><br />Ø         虽然活动图是一种直观和通用的表达，但在图形表述上有一个主要问题，就是没有区分状态和动作，都用活动来建模；<br /><br />Ø         UML活动图的第二个问题是在UML2.0版本中引入的，当多个迁移到达一个活动（只读状态）时，以前的版本指定为一个缺省合并，而在2.0版中指定为需要同步的缺省联合；<br /><br />Ø         只要对两条构建语义作如下的变化，UML活动图仍旧可以用来对业务流程状态层建模：<br /><br />Ø         在用图形表述业务流程时，只建模状态层（状态和控制流），不包括动作。这意味着图形中的矩形都是状态而不是活动；<br /><br />Ø         如果多个迁移到达一个状态，缺省定义为不需要同步的合并；<br /><br />Ø         在流程执行过程中，WfMS使用令牌（token）作为跟踪流程状态的指示器；当令牌到达一个状态时，被分配给WfMS等待的外部参与者；<br /><br />Ø         外部参与者可以是个人、组织或者计算机系统，我们定义流程运行的执行人或系统为参与者（actor）；<br /><br />Ø         只有在WfMS需要访问组织结构信息时，才将令牌分配给一个参与者<br /><br />Ø         工作流系统通过分配令牌构建任务列表<br /><br />l         上下文层<br /><br />Ø         流程上下文变量或简称变量，是与流程实例相关的变量；<br /><br />Ø         流程变量允许流程开发人员在流程实例的生命周期中存储数据；<br /><br />Ø         WfMS具有固定的一组数据类型，也可以定义自己的数据类型；<br /><br />Ø         注意变量也可以保存引用，例如可以引用数据库中的记录、网络上的文件；<br /><br />Ø         和流程变量相关的另一个有趣的方面是：WfMS如何将数据转化为信息；<br /><br />Ø         工作流用于在组织内部的各种异构系统之间实现任务和数据进行协同；<br /><br />Ø         对于业务流程中人工执行的任务，WfMS负责从其他相关系统，如SAP、数据库、CRM系统、文档管理系统收集相关数据。在业务流程的每一个人工步骤，只有相关的数据项从异构系统中收集和计算；<br /><br />Ø         通过这种方式，从不同系统来的数据被转换并呈现为信息<br /><br />l         程序逻辑层<br /><br />Ø         动作是在流程运行过程中WfMS为响应指定事件而执行的一段程序逻辑<br /><br />Ø         程序逻辑可以是二进制或源代码形式的、用任何语言或脚本编写的软件片断<br /><br />Ø         程序逻辑层根据指定事件的信息将需要执行的所有软件片断组合<br /><br />l         用户界面层<br /><br />Ø         参与者通过向流程变量填充数据的事件，来触发结束一个状态<br /><br />Ø         某些WfMS允许指定哪些数据可以填充到流程中，以及如何存储到流程变量中<br /><br />Ø         可以生成UI表单从用户收集这些信息<br /><br /><br />与WfMS相对的可执行业务流程<br /><br />l         当前BPM领域的新趋势是可执行业务流程的集中规范<br /><br />l         XLANG、WSFL 和BPML合并为基于交互（消息交换）的BPEL<br /><br />l         BPEL在面向服务体系结构(SOA)环境下定义，其前提条件之一是服务必须用WSDL声明<br /><br />l         BPEL规定了一套看作一种编程语言的XML语法，通过掉用WSDL中定义的服务整合控制流<br /><br />l         可执行业务流程和基于状态的WfMS所使用的方法中，有三点主要的区别：<br /><br />Ø         基于状态VS面向消息：基于状态的WfMS以状态（或者活动）概念为中心，工作流引擎维护状态并计算从一个状态到另一个状态的迁移；另一方面，像BPEL这样的可执行流程以响应输入消息的定义为中心，可以将一组这样的响应以及其他信息看作一个业务流程，这解释了为什么BPEL是基于状态的WfMS的一些补充；例如，BPEL响应输入消息的onMessage事件处理器，可以在状态之间迁移时执行<br /><br />Ø         流程实例ID VS消息关系：可执行业务流程的复杂性之一是消息关系；流程描述的一部分必须说明BPEL引擎如何从输入消息中确定流程实例的标识，这必须基于输入消息的一个数据项；而基于状态的WfMS为每个创建的流程实例生成ID，客户端可以在后面调用引擎API时使用这个ID<br /><br />Ø         核心工作流引擎API VS抽象服务端点（endpoint）：基于状态的WfMS提供一组核心API，这意味着客户端通过调用核心API管理所有流程实例的执行；在可执行业务流程中，每个流程表现为一个服务，这意味着每个流程定义都有一个不同的访问点
          <br/>
          <span style="color:red;">
            <a href="http://gabriel80.javaeye.com/blog/178346#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 01 Apr 2008 11:59:07 +0800</pubDate>
        <link>http://gabriel80.javaeye.com/blog/178346</link>
        <guid>http://gabriel80.javaeye.com/blog/178346</guid>
      </item>
      <item>
        <title>工作流术语和定义 </title>
        <author>gabriel80</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://gabriel80.javaeye.com">gabriel80</a>&nbsp;
          链接：<a href="http://gabriel80.javaeye.com/blog/178344" style="color:red;">http://gabriel80.javaeye.com/blog/178344</a>&nbsp;
          发表时间: 2008年04月01日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          1.1.1.	工作流<br />就是工作从开始到完成的过程。工作流由流程逻辑和路线规则组成。流程逻辑定义了任务的顺序和必须遵循的路线规则，还有截止期限以及由工作流引擎实现的其他业务规则<br />1.1.2.	流程定义（process definition）<br />一个图形流程定义或流程图，代表工作流的流程逻辑元素以及各元素之间的关系<br />1.1.3.	流程实例（process instance）：<br />一个流程实例，通常称为工作，是一个流程定义的运行实例<br />1.1.4.	状态(state，或者说等待状态)：<br />代表一种对外部参与者的依赖；这意味着在流程运行时流程引擎必须等待，直到外部参与者通知工作流系统指定的状态完成了<br />1.1.5.	动作（action）：<br />在流程运行过程中，工作流系统为响应指定事件运行的一段程序逻辑；当流程运行过程中指定的事件发生时，工作流系统启动并执行这些动作<br />1.1.6.	流程上下文变量（process context variable）：<br />保存每一个流程运行的上下文信息；通常在流程定义中声明这些变量，然后在流程实例生成时被实例化<br />1.1.7.	参与者<br />以下类型之一：资源集、特定资源、组织单元、角色（一个人在组织内部的作用）、人或系统（自动代理）。<br />1.1.8.	活动<br />组成流程定义中的一个逻辑步骤的任务。可以是自动的或人工的。自动指在流程操作过程中定义脚本和触发器的能力。流程定义中的特定活动可以作为无人参与的任务来运行，自动化可以在手工或人力驱动的任务中执行业务规则。常见的一种自动活动就是截止期限管理，如果某个工作项在预定的截止期限之前未能完成，该管理可以自动发送一条提醒消息或触发一个延期程序。<br />1.1.9.	活动所有者<br />活动所有者是有权宣布一个活动结束，然后推进工作到流程中的下一个活动的参与者<br />1.1.10.	工作所有者<br />工作所有者是有权整体控制流程实例执行过程的参与者<br />1.1.11.	工作项<br />代表流程实例中活动的参与者将要执行的工作
          <br/>
          <span style="color:red;">
            <a href="http://gabriel80.javaeye.com/blog/178344#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 01 Apr 2008 11:53:49 +0800</pubDate>
        <link>http://gabriel80.javaeye.com/blog/178344</link>
        <guid>http://gabriel80.javaeye.com/blog/178344</guid>
      </item>
      <item>
        <title>关于JPDL流程发布</title>
        <author>gabriel80</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://gabriel80.javaeye.com">gabriel80</a>&nbsp;
          链接：<a href="http://gabriel80.javaeye.com/blog/176368" style="color:red;">http://gabriel80.javaeye.com/blog/176368</a>&nbsp;
          发表时间: 2008年03月26日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          一。前言：<br />   在JBPM中，有很多API是供JBPM自身调用的，如流程定义文件中支持的Expression语言，脚本等（org.jbpm.jpdl.el.impl），我们不用理会。 <br /><br />我们主要和下面三类API打交道： <br />JBPM环境的配置、service的管理、流程的部署和卸载：它主要体现在org.jbpm中，另外辅助包有org.jbpm.jpdl.xml、org.jbpm.configuration。 <br />org.jbpm.configuration负责services对象的创建，相当于一个微型的IoC容器、对象工厂，负责services的生命周期管理，如加载、创建、调用和销毁，像Job调度服务、数据库持久化服务、异步消息服务等。需要说明的是，由于其package下的ObjectFactoryImpl也是一个IoC容器，和Spring的IoC容器是有相同的职责：对象的管理。所以在这种松耦合架构下，可以将JBPM和Spring集成，如业务系统和JBPM引擎的事务处理、对象管理、配置管理等。请参考Spring-Module开源项目。 <br /><br />org.jbpm.jpdl.xml负责流程定义文件的解析，譬如XML文件的解析，相关领域对象的实例化。通过hack其源码和原理，我们可以在业务系统中自定义流程，让用户可以自己定义、变更流程。 <br /><br />JBPM中领域对象：如Node、Token、ProcessInstance、TaskInstance等，它们有三个职责，一个是保持从DB中加载流程和任务相关的数据或将数据持久化到DB。第二，为各领域对象建立关联，方便实现透明持久化（复杂的领域关联在Hibernate的mapping文件里配置）。第三，就是处理业务规则，如引擎调度算法，但不负责持久化。 <br /><br />JBPM中持久化领域对象的Manager，DAO：如TaskMgmtSession。它们主要是持久化领域对象，如session.save(ProcessInstance)；或是执行查询，如根据流程ID查询该流程实例，查询操作都是配置在hibernate mapping中的hql语句，如hibernate.queries.hbm.xml。但可能并不能满足我们的要求，譬如按时间段查询当前的流程实例，任务的分页查询，这样，就需要我们自己扩展这些DAO类。由于它们查询是只读操作，所以很容易，而且扩展几乎是必然了，因为要是按JBPM默认的，把所有的Result查询出来，再过滤，性能是个很大的问题，我们应该按需查询。 <br /><br />二。按功能分类说明<br />  JBPM流程的部署和卸载 <br />JBPM流程的部署和卸载，无论是通过管理控制台还是自定义部署，最终都是通过JbpmContext的 deployProcessDefinition(ProcessDefinition)部署，而ProcessDefintion实例的创建，是通过调用ProcessDefinition的相关方法，如parseXmlResource (String xml)。 <br /><br />ProcessDefintion实例的创建，有多种输入源，譬如XML字符串、XML文件、zip包，还有最抽象的Reader、InputStream。如果在用户的业务系统里面自定义发布业务流程，也最终是调用ProcessDefinition相关方法。但流程定义解析，最核心的只有一个类：org.jbpm.jpdl.xml包下的JpdlXmlReader， <br /><br />org.jbpm.JbpmContext：该类可以理解为Façade模式的实现，与流程相关的manager类可以通过它取得，如getGraphSession()、getServices()，它是获取其它服务的快捷方式，也算是一个delegate类。如果大家对Context的概念比较敏感，其类职责就很好理解，在Servlet容器里面也有ServletContext的概念，和它意思差不多。对一般的系统软件一般来说，Context往往建模成Container的上下文。在JBPM中，它还负责流程部署、加载、卸载。<br /><br />3.附带说明：<br />  JBPM的任务管理 <br />JBPM和任务管理相关的类主要是org.jbpm.taskmgmt.def和org.jbpm.taskmgmt.exe，像任务创建、分配等。 <br />和任务相关的最重要的有两个方面，一个是任务分配，另一个是和任务相关的表单。当然，任务查询和任务日志也很重要。 <br /><br />任务分配：解决的是将任务分配给谁，它有静态分配和动态分配两种，前者是在流程定义文件里部署，后者是通过代码动态指定。它涉及到的概念有Actor，PooledActor，Swimlane，AssignmentHandler。在做demo时，譬如JBPM官方自带的例子webSale里，就是通过Expression静态部署任务角色的，如user(leo)，group(orderManager)，但它用到了JBPM的第三方组件Identity，其实通过Expression静态分配角色，本质上也是通过AssignmentHandler实现的，如ExpressionAssignmentHandler。 <br />任务分配，一般比较灵活的方案是在流程的Swimlane里面部署自定义action，然后重用swimlane。另外一种方案是，在每个task里面部署AssignmentHandler实现类。 <br /><br />任务相关表单：主要是org.jbpm.taskmgmt.def.TaskController，它是task scope下的表单字段，类似Servlet里面的HttpServletRequest的setAttribute()。如果是process scope下的表单项，是org.jbpm.context.exe.ContextInstance，类似于Servlet里面的HttpSession的setAttribute()。 <br /><br />附带说一下任务查询，所有有关查询和持久化的操作，都集中在包org.jbpm.db中，如任务相关的TaskMgmtSession，要是这些find方法不满足业务要求，建议自己扩展。 <br /><br />JBPM的流程日志 <br />JBPM的流程日志，主要是记录一些事件（Event），如流程创建、任务分配，它们在GraphElement的fireEvent时，譬如在Node.leave()（Token离开当前节点时）触发fireEvent事件（在该事件方法里执行自定义Action），同时记录日志。我们关心的日志主要有process、task、transition、signal四类，每个下面还有事件细分，如task创建和分配。通过日志，我们统计流程执行效率，也可以得到详细的流程步骤日志。 <br /><br />日志的查询，请参考LoggingSession及其相关类。顺便说一下，所有的日志类都继承于ProcessLog，约20来个。JBPM已经声明的日志查询方法，可能并不能满足我们的要求，自行扩展吧。
          <br/>
          <span style="color:red;">
            <a href="http://gabriel80.javaeye.com/blog/176368#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 26 Mar 2008 15:51:05 +0800</pubDate>
        <link>http://gabriel80.javaeye.com/blog/176368</link>
        <guid>http://gabriel80.javaeye.com/blog/176368</guid>
      </item>
  </channel>
</rss>