??xml version="1.0" encoding="utf-8" standalone="yes"?>国产一区二区三区亚洲综合,亚洲深深色噜噜狠狠爱网站,亚洲国产午夜电影在线入口http://www.tkk7.com/rosen/archive/2006/04/30/44209.htmlRosenRosenSun, 30 Apr 2006 07:33:00 GMThttp://www.tkk7.com/rosen/archive/2006/04/30/44209.htmlhttp://www.tkk7.com/rosen/comments/44209.htmlhttp://www.tkk7.com/rosen/archive/2006/04/30/44209.html#Feedback5http://www.tkk7.com/rosen/comments/commentRss/44209.htmlhttp://www.tkk7.com/rosen/services/trackbacks/44209.html阅读全文

Rosen 2006-04-30 15:33 发表评论
]]>
Drools Z的业务逻辑提供框架Q翻译)http://www.tkk7.com/rosen/archive/2005/09/11/12668.htmlRosenRosenSun, 11 Sep 2005 08:34:00 GMThttp://www.tkk7.com/rosen/archive/2005/09/11/12668.htmlhttp://www.tkk7.com/rosen/comments/12668.htmlhttp://www.tkk7.com/rosen/archive/2005/09/11/12668.html#Feedback8http://www.tkk7.com/rosen/comments/commentRss/12668.htmlhttp://www.tkk7.com/rosen/services/trackbacks/12668.html阅读全文

Rosen 2005-09-11 16:34 发表评论
]]>
充分利用 OSWorkflow ?functionhttp://www.tkk7.com/rosen/archive/2005/08/12/9888.htmlRosenRosenFri, 12 Aug 2005 02:24:00 GMThttp://www.tkk7.com/rosen/archive/2005/08/12/9888.htmlhttp://www.tkk7.com/rosen/comments/9888.htmlhttp://www.tkk7.com/rosen/archive/2005/08/12/9888.html#Feedback0http://www.tkk7.com/rosen/comments/commentRss/9888.htmlhttp://www.tkk7.com/rosen/services/trackbacks/9888.html    使用 OSWorkflow 已经有段旉了,现在看来实际需求不是请假条程原型q么单?BR>   
    有这L需求:OA pȝ中的公文审批共有六个 stepQ采用单点(不牵?split ?joinQ逐审核方式Q不同角色登陆时Q由同一面处理Qؓ了便于收发文l计Q必ȝ道下一个接收h是哪个?BR>   
    ׃在触发当?action 的同时就要设|好下一接收者,遂需要引q新的协作表。当 action 时要调用另外?save ҎQ而这一q程当然不能在表现层q行。最开始的做法是用一个辅?service 来取出每?action 的下一接收者,如下Q?/P>

  public List getLeader(int type,int companyId) {
  switch (type) {
   case 1:
    return docSendDao.getThisFaculty(companyId);
   case 2:
    return docSendDao.getOffice();
   case 3:
    return docSendDao.getSecGroup();
   case 4:
    return docSendDao.getOfficeLead();
   case 5:
    return docSendDao.getSecFaculty();
   default :
    return new ArrayList();
  }
 }

    q种做法在开发的前期q觉得不错,随着需求的q一步详l,发现当新增、修ҎE时Q也许我们要在这?service 中满山遍野的扑֯到底代码在哪里。更p糕的是产品提交用户后,用户不会pq么大的耐心让你q样l护。在l过短暂的思考后Q决定利?OSWorkflow ?FunctionProvider 接口?script 做文章?BR>   
    一个比较成熟的x是(如各位有更好的方案不妨交)Q每个流E都可能面修改Q那把程的每?action 要做的事抽取出来Q这样修改v来相对独立,比如要把下一默认接收者改成其他hQ另一个目的是快速响应用户对新流E的需求,在提出需求后Q生成相应的程文g及每?action 要做的事Q提交到服务器,重启可以用了,而不是在已有代码基础上新增。这里的“每?action 要做的事”就?OSWorkflow ?FunctionProvider 接口Q实现这个接口,可以ؓ所Ʋؓ了?BR>   
    代码片断如下Q?BR>

 程定义
    <step id="1" name="U领导审?>
      <actions>
        <action id="2" name="批准" view="批准">
          <results>
            <unconditional-result id="2" old-status="Finished" status="Queued" step="2" owner="${stepOwner}">
           <pre-functions>
           //?FacultyLea c说明当前调用?BR>    <function type="beanshell">
     <arg name="script">
                        String caller = context.getCaller();
                        transientVars.put("caller", caller);
                    </arg>
    </function>
                     //FunctionProvider 实现c?BR>                     //向协作表中写入当前调用者和下一默认接收?BR>             <function name="set.caller" type="class">
               <arg name="class.name">***.*****.util.FacultyLea</arg>               </function>
           </pre-functions>
        </unconditional-result>
          </results>
        </action>
        <action id="3" name="拒绝" view="拒绝">
          <results>
            <unconditional-result id="3" old-status="Finished" status="Finished" step="7"/>
          </results>
        </action>
      </actions>
    </step>

FacultyLea

public class FacultyLea implements FunctionProvider{
 
 ReadProperty readProperty = ReadProperty.getInstance();
 ApplicationContext ctx=new
 FileSystemXmlApplicationContext(System.getProperty("user.dir")+"/web/WEB-INF/classes/applicationContext.xml");
 
 private SendDao sendDao = (SendDao) ctx.getBean("sendDao");
 private DocService docService = (DocService) ctx.getBean("docService");
 
 public void execute(Map transientVars, Map args, PropertySet ps) throws WorkflowException {
  long l=((HibernateCurrentStep)((Collection)transientVars.get("currentSteps")).toArray()[0]).getEntryId();
 Doc md=docService.findDocByWrokFlowId(l+"");
 String caller=(String)transientVars.get("caller");
  
 //讄下一步的接收?BR> Timestamp date = new Timestamp(System.currentTimeMillis());
 String query = "some hql here";
 List leaders = docSendDao.find(query);
        for(int i=0;i<leaders.size();i++){
            Send send = new Send();
            send.setSendUser(new UserLogin(new Integer(caller)));
            send.setDoc(md);
            ......
            sendDao.save(send);
        }
  
 //讄该步骤处理?BR>  transientVars.put("stepOwner", caller);
 }
}

   function 只是 OSWorkflow 为我们提供众多功能中的一个,如果可能Q我会把另外的用心得写出来?/P>

   
h意!引用、{贴本文应注明原作者:Rosen Jiang 以及出处Q?/FONT>http://www.tkk7.com/rosen



Rosen 2005-08-12 10:24 发表评论
]]>
Shark 怎样...Q翻译)http://www.tkk7.com/rosen/archive/2005/08/12/9887.htmlRosenRosenFri, 12 Aug 2005 02:22:00 GMThttp://www.tkk7.com/rosen/archive/2005/08/12/9887.htmlhttp://www.tkk7.com/rosen/comments/9887.htmlhttp://www.tkk7.com/rosen/archive/2005/08/12/9887.html#Feedback0http://www.tkk7.com/rosen/comments/commentRss/9887.htmlhttp://www.tkk7.com/rosen/services/trackbacks/9887.html阅读全文

Rosen 2005-08-12 10:22 发表评论
]]>
Enhydra Shark 理Q翻译)http://www.tkk7.com/rosen/archive/2005/08/12/9884.htmlRosenRosenFri, 12 Aug 2005 02:09:00 GMThttp://www.tkk7.com/rosen/archive/2005/08/12/9884.htmlhttp://www.tkk7.com/rosen/comments/9884.htmlhttp://www.tkk7.com/rosen/archive/2005/08/12/9884.html#Feedback0http://www.tkk7.com/rosen/comments/commentRss/9884.htmlhttp://www.tkk7.com/rosen/services/trackbacks/9884.html阅读全文

Rosen 2005-08-12 10:09 发表评论
]]>
Shark 从零开?I)Q翻译)http://www.tkk7.com/rosen/archive/2005/08/12/9883.htmlRosenRosenFri, 12 Aug 2005 02:05:00 GMThttp://www.tkk7.com/rosen/archive/2005/08/12/9883.htmlhttp://www.tkk7.com/rosen/comments/9883.htmlhttp://www.tkk7.com/rosen/archive/2005/08/12/9883.html#Feedback0http://www.tkk7.com/rosen/comments/commentRss/9883.htmlhttp://www.tkk7.com/rosen/services/trackbacks/9883.html    本文一步步讲解如何从获得、编译、徏立环境到q行 Shark 的方法。按照本文给出的步骤QShark 可实际运行v来。应该注意的是,本文所用数据库?MySQLQƈ?windows 2000 上运行。本文是从很多笔记和 Shark 组提供的线索中ȝ出来的,q种l历痛苦而又q运?br />   
    之所以我没有使用可执行安装程序的原因是,我想从零开始来构徏 Shark?br />   
    你最好拥有或能够安装下列E序Q但qƈ不是 shark 所必需的,仅仅是本文档的要求:
   
    1、MySQL - 我?4.0.16-nt
    2、MySQL Connector - 我选择 mysql-connector-java-3.0.11-stable-bin.jar
    3、Java - 我?Sun j2sdk 版本?1.4.2_04
    4、CVS, Winzip, {等

    首先Q自q立安装它们,然后开始我们的 shark 学习Q?br />   
获得 Shark

    我个人的安装方式是把所有的源文件拷贝到 C:\dev\Shark 目录下,最后的输出路径?C:\Shark。你也可以自己放在Q何地方,不过要调整以下命令?br />   
    首先下蝲 Shark 1.0 http://forge.objectweb.org/project/showfiles.php?group_id=74&release_id=512
    对于 Windows pȝQ我下蝲 zip 文gq解包到 C:\dev\Shark 目录?br />   
    如果你想获取 CVS Q?a >http://forge.objectweb.org/scm/?group_id=74Q?
上的版本,则命令说明如?
   
    通过使用下面的命令集Q你可以?anonymous ?shark ?cvs 库取C码。下面的 modulename 指你惌 checkout 的模块名Uͼ如果你不知道模块名称Q请???代替?/p>

如果有提C求输入口令,?enter 可以了?/p>

    cvs -d:pserver:anonymous@cvs.forge.objectweb.org:/cvsroot/shark login

    cvs -z3 -d:pserver:anonymous@cvs.forge.objectweb.org:/cvsroot/shark co modulename


    在?CVS 的情况下Q我?/dev/Shark 作ؓ CVS 根目录?br />   
~??/strong>
   
    切换?C:\dev\Shark 目录。运行下列命令:
   
    configure -help

    你会得到下面的输?

 Parameters value for using with configure.bat :

 configure       - Make build.properties file with default values

 configure -help - Display this screen

 configure [-jdkhome jdk_home_dir] [-instdir installdir] -writes proper parameters to the build.properties file
 Examples :

 configure -jdkhome c:/j2sdk1.4.1 -instdir C:/Shark-1.0

    有一?*nix shell 脚本可以做同L事情。对我来说用q个更简单,我不需要进?jdkhome 讄Q因为我?JAVA_HOME 已经讄好了Q我的安装目录是 c:/SharkQ下面是我用的命oQ?/p>

     configure -instdir c:/Shark

    q个命o实际上是?build.properties 文g中填充属性字D,我的文g是如下:

 version=1.0
 version_release=beta2
 version_build=13
 jdk_dir=C:/j2sdk1.4.2_04
 install_dir=C:/Shark
 build_debug=on
   
    现在准备开始编译了。编译?antQ但你应该用已经提供?make file。用帮助选项来查看到底有哪些选项可用Q?br />   
        make –help
   
    大部分的选项要求我们必须先完全构建。当Ӟ也可以用 shell 脚本来完成这个Q务。我们用下面的命令来完全构徏Q可能要Ҏ_?br />   
        make buildAll
       
    执行上述命oQant 会构建所有的参数。凭借少许运气,׃利完成。如何处理构Z的问题超Z本文的范畴。最后,把这些前期准备好的原材料Q文档,工具{等打包Q再装蝲C前指定的安装路径?br />   
        make install
       
    该命令会l装Q拷贝)文gC的安装\径(我的?C:\SharkQ?br />   
快速测?/strong>

    Z快速测试,我们运行默认配|的 Shark 理E序?br />   
    在安装目录中Q通常有个叫做 runsa.bat 的文件。运行该文g。Shark 理E序QswingQ将启动Q开始向你询问用户名和密码了Q分别是 "admin" ?"enhydra"。如果验证通过Q将会马上证明构建是成功的?br />   
    TODOQ详情请链接?Enhydra Shark 理文档
   
配置 Shark

    下面Q我们开始配|?Shark
   
    修改 Shark.conf
   
    首先Q在 Shark 路径中找到名?Shark.conf 的文件。用你喜Ƣ的~辑器打开它,W一个参数是Q?br />   
    enginename=Shark
   
    我们留下这一主题。正如前面笔记所提到的,虚拟机和数据库的不同导致配|的差异。对于初ơ测试,我们不用改变参数倹{请注意被注释了?HypersonicSQL 驱动信息QHSQL 是运?Shark 的默认数据库Q由?Shark 不能q行在多数据库^CQ我们配|ؓ MySQL?br />   
 # HypersonicSQL
 #DatabaseManager.DB.sharkdb.JdbcDriver="org.hsqldb.jdbcDriver"
 #DatabaseManager.DB.sharkdb.Connection.Url="jdbc:hsqldb:C:/Shark/db/hsql/hsql"
 
 未注释的 MySQL 部分Q?/p>

 # MySQL
 DatabaseManager.DB.sharkdb.JdbcDriver="org.gjt.mm.mysql.Driver"
 DatabaseManager.DB.sharkdb.Connection.Url="jdbc:mysql://localhost/shark"
 
 h意,q里我还是完全用默认配置。该配置表明数据库是在本地机器上Q用户名/密码使用 MySQL 默认?"sa" ?""。如果这U配|不适合你,你完全可以修改它?br /> 
 #
 # Default cache configuration
 #
 DatabaseManager.defaults.cache.maxCacheSize=0
 DatabaseManager.defaults.cache.maxSimpleCacheSize=0
 DatabaseManager.defaults.cache.maxComplexCacheSize=0
 DatabaseManager.defaults.cache.reserveFactor=0.1
 
 在这个部分,是了解我如何使用 Shark 的好途径Q除非你?CORBA 通讯Q否则应用程序将直接与数据库交互。这些都不是 Shark 服务器代码。所以如果你有多个客LQ它们都需要与数据库直接交互。由于无法更新多个客L的缓存,所以我关闭了缓存?br /> 
 LRU ~存也应该被关闭Q?br /> 
 #=============================================================================
 # Default cache is LRU
 #
 #-----------------------------------------------------------------------------
 # Cache defaults
 #
 #CacheManagerClassName=org.enhydra.shark.caching.LRUCacheMgr
 
 好了Q目的达刎ͼ保存后关闭该文g?br /> 
 创徏数据?/strong>
 
 现在安装 MySQLQ创Z个名?"shark" 的数据库。如果你x变名字,需要在 Shark.conf 文g中修Ҏ据库 URL?br /> 
 其次Q编?C:\Shark 目录?recreateDB.bat 文g。注释掉 Hypersonic 部分Q再反注释掉 MySQL 部分?br /> 
 rem HypersonicSQL database
 rem rmdir /q /s db\hsql
 rem mkdir db\hsql
 rem set LOADERJOBXML=sql\hsql\LoaderJob.olj
 
 rem MySQL database
 set LOADERJOBXML=sql\mysql\LoaderJob.olj
 
 最后,我们改变执行调用,因ؓ脚本喜欢创徏新窗口,而且在你看见错误信息前就关闭了。像q样修改它:
 
 start "Recreate Database" "C:\j2sdk1.4.2_04\bin\java" -Djava.ext.dirs=lib org.webdocwf.util.loader.Loader -cjs shark/conf  %LOADERJOBXML%
 
 修改后:
 
 "C:\j2sdk1.4.2_04\bin\java" -Djava.ext.dirs=lib org.webdocwf.util.loader.Loader -cjs shark/conf  %LOADERJOBXML%
 
 当然Q如果你?JDK 和上面的不一PW一部分的引用会不同?br /> 
 保存后关?recreateDB.bat 文gQ再打开 LoaderJob.olj 文g。在我的pȝ中,位置?C:\Shark\sql\mysql\LoaderJob.olj。其实你不需要做什么的Q但应注意连?URL 是否存在Q如果你变更了数据库名,也要在这里修攏V?br /> 
 最后的步骤是拷贝数据库驱动包到 C:\Shark\lib 目录。我使用 MySQLQ所以拷贝相应的 jar 文g?lib 目录?br /> 
 现在q行 recreateDB 脚本。如果没有意外,成功了。如果你发现了错误信息,再ơ运行该脚本。再ơ阅?“快速测试?以确定所有步骤都已完成。你可以同时q行两个一L理E序来测试多客户端环境?/p>


h意!引用、{贴本文应注明原译者:Rosen Jiang 以及出处Q?/font> http://www.tkk7.com/rosen



Rosen 2005-08-12 10:05 发表评论
]]>
Enhydra Shark 介(译Q?/title><link>http://www.tkk7.com/rosen/archive/2005/08/12/9882.html</link><dc:creator>Rosen</dc:creator><author>Rosen</author><pubDate>Fri, 12 Aug 2005 02:01:00 GMT</pubDate><guid>http://www.tkk7.com/rosen/archive/2005/08/12/9882.html</guid><wfw:comment>http://www.tkk7.com/rosen/comments/9882.html</wfw:comment><comments>http://www.tkk7.com/rosen/archive/2005/08/12/9882.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/rosen/comments/commentRss/9882.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/rosen/services/trackbacks/9882.html</trackback:ping><description><![CDATA[ <p> <font size="3"> <strong>?l?/strong> </font> </p> <p>    Enhydra Shark 目以一U不同的方式交付了一个工作流服务器?br />    <br />    Enhydra Shark 是一个可扩展的工作流引擎框架Q它包括一个完全基?WFMC 规范的标准实玎ͼ它用XPDLQ没有Q何自己新的扩展)作ؓ自n的工作流程定义格式Q用WFMC ?"ToolAgents" API 作ؓpȝzd的服务器端的执行形式?br />    <br />    Enhydra JaWE 囑ŞXPDL~辑器可用于?Enhydra Shark 生成 XPDL 程定义Q?br />    <br />    ToolAgents 可用?JavaScriptQJDBC 讉KQEJB 讉KQ纯 Java c,CORBA 调用QEMailQWebservice 调用Q等{?..</p> <p>    程与活动实例的存储通过一个可配置的持久化 API 来完成。持久层实现采用的标准是轻量U的Enhydra DODS O/R mapping 工具。更多重量 J2EE EJB 持久层选择Ҏ在下面展C?br />    <br />    每个单一构gQ持久层Q事务管理,脚本引擎Q流E库...Q可用于它的标准实现或被目特定模块所扩展/取代?br />   <br />    通过q种方式QEnhydra Shark 可作Z个简单的位于servlet ?swing 应用或运行在J2EE 容器Q支持会?bean API 以及用于 EJB 持久化)中的"Java library"QCORBA ORB ?Web 服务来用?br />    <br />    工作引擎内ؓ高负载环境下的活动工作流对象提供可配|的 LRU ~存。缓存可在集部|时关闭?</p> <p>    当工作流q行ӞWFMC WDF API 规范用来把 JAWe ~辑器或 selfwritten E序附加在运行期实例信息上,甚至修改实例。用这一ҎQEnhydra Shark支持动态工作流机制Q能修改其自w来支持更复杂的工作环境或l织的异常处理?br />   <br />    通常Q基?Swing 的管理GUI可用于管理工作。JMX 扩展和基?HTML 的管理客L也可用于理?br />   <br />    其他 API 可用于知识库讉KQ日志,知识库持久化Q事仉知Q以及ؓ转换评估(transition evaluations)设计的脚本引擎适配器?br />    <br /><strong><font size="3">ObjectWeb 工作工作组<br /></font></strong>    <br />    2003 q?12 月,新的 ObjectWeb 工作工作组会议首次召开?br />    <br />    本次会议的目标是在当?ObjectWeb 工作项目,也就是在 "Enhydra Shark"?COW" ?"Bonita" 之间定可行的协作规则?br />会议达成的共识是Q这些组件的 API 应该遵@各自的标准(WFMCQOMGQBPELQ。这些组件将会是未来独立工作引擎项目的l成部分?br />    <br />    所有组件将不会依赖于特定的q行环境QSwingQServletsQJ2EE/EJBQCORBA...Q?br />    <br />    要选择一个通用lg模型Q?glue"Q,当前非常可能的徏议是采用 "Fractal"?br />    新的邮g列表已经建立Q以方便讨论日常工作工作组事宜和支持项目间的合作。该列表可在 <a >http://www.objectweb.org/wws/info/wow</a> 上找到?br />   其它达成的共识是使用 Enhydra JaWE 作ؓ ZXPDLq行程定义的通用~辑器?/p> <p>    对WFMC WDFQ工作流定义功能Q的研究表明,?API 是否适合为流E和zd实例q行动态修攏V如?WDF 成ؓ API 的首选,JaWE 支持该 API 以在q行期间可以q行囑Ş化观看和实例修改?br />    <br />    以下列出了初步确定的lg列表Q?br />    <br />        模型?br />        映射模块Q包括到ToolAgentsQ脚本语a/引擎Q以及参与者(用户和组Q的映射<br />        程和活动实例持久化Q基?Enyhdra DODS, Speedo, EJB's,...Q?br />        脚本引擎适配?包装器,适用于不同脚本语aQJavaScript, Python,...Q的程转换评估?br />        zd程和活动实例的q行期缓存(Perseus ?Q?br />        事务理QGOTM ?Q?br />        ToolAgents <br />        分派APIQ用于动态参与者映?br />        通知 APIQJabber, JMS, ...Q?br />        日志Q系l日志和理zd日志Q?br />        截止期(DeadlineQ管理(zd截止期(deadlinesQ? zd持箋旉QdurationsQ? ...Q?br />        记时器(Quartz, J2EE Timer Services,...Q?br />        升QEscalationQ?<br />    </p> <p> <font size="3"> <strong>Enhydra Shark 架构</strong> </font> </p> <p>    Ҏ上述已达成共识的SharklgQ当?Enhydra Shark 架构目标如下图所C?br />    <br /><img style="WIDTH: 657px; HEIGHT: 954px" height="1071" alt="" src="http://shark.objectweb.org/localmedia/SharkArch.jpg" width="657" /></p> <p> <br /> <br /> <strong> <font color="#ff0000" size="2">h意!引用、{贴本文应注明原译者:Rosen Jiang 以及出处Q?/font> </strong> <a href="/rosen"> <strong> <font color="#ff0000" size="2">http://www.tkk7.com/rosen</font> </strong> </a> </p> <img src ="http://www.tkk7.com/rosen/aggbug/9882.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/rosen/" target="_blank">Rosen</a> 2005-08-12 10:01 <a href="http://www.tkk7.com/rosen/archive/2005/08/12/9882.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>OSWorkflow 探烦http://www.tkk7.com/rosen/archive/2005/08/12/9880.htmlRosenRosenFri, 12 Aug 2005 01:59:00 GMThttp://www.tkk7.com/rosen/archive/2005/08/12/9880.htmlhttp://www.tkk7.com/rosen/comments/9880.htmlhttp://www.tkk7.com/rosen/archive/2005/08/12/9880.html#Feedback27http://www.tkk7.com/rosen/comments/commentRss/9880.htmlhttp://www.tkk7.com/rosen/services/trackbacks/9880.html 2007-04-16   版权声明

我知道这文章阅读量很大Q但是请要l{载本文的同志注意一下,本文是我?2005 q中旬在成都麦柯pȝ集成有限公司写的Q作为公司的技术探索ƈ希望应用在公?OA 产品中。请保留原文版权信息 OKQ?/strong>

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

?a

    本文没有抛出可运行的范例Q仅仅是E序片断而已Q不q在 OSWorkflow ?Wiki 上,Quake Wang 已把官方入门教程完整地翻译成中文了,有兴的读者可去阅诅R关?OSWorkflow 更加l节性的内容Q可参考官Ҏ册,怿你在了解了入门教E后Q可L阅读官方手册?br />   
OSWorkflow 概念

    在商用和开源世界里QOSWorkflow 都不同于q些已有的工作流pȝ。最大不同在?OSWorkflow 有着非常优秀的灵zL。在开始接?OSWorkflow 时可能较难掌握(有h说不适合工作新手入门)Q比如,OSWorkflow 不要求图形化工具来开发工作流Q而推荐手工编?xml 格式的工作流E描q符。它能ؓ应用E序开发者提供集成,也能与现有的代码和数据库q行集成。这一切似乎给正在L快速“即插即用”工作流解决Ҏ的h刉了ȝQ但研究发现Q那些“即插即用”方案也不能在一个成熟的应用E序中提供够的灉|性来实现所有需求?br />   
OSWorkflow 优势

    OSWorkflow l你l对的灵zL。OSWorkflow 被认为是一U“低U别”工作流实现。与其他工作系l能用图标表现“loops(回\)”和“conditions(条g)”相比,OSWorkflow 只是手工“编?coded)”来实现的。但qƈ不能说实际的代码是需要完全手工编码的Q脚本语a能胜任这U情形。OSWorkflow 不希望一个非技术用户修改工作流E,虽然一些其他工作流pȝ提供了简单的 GUI 用于工作编辑,但像q样改变工作,通常会破坏这些应用。所以,q行工作调整的最佳h选是开发h员,他们知道该怎么改变。不q,在最新的版本中,OSWorkflow 也提供了 GUI 设计器来协助工作的~辑?/p>

    OSWorkflow Z有限状态机概念。每?state ?step ID ?status 联合表现Q可单理解ؓ step 及其 status 表示有限状态机?stateQ。一?state 到另一 state ?transition 依赖?action 的发生,在工作流生命期内有至一个或多个zd?state。这些简单概念展C OSWorkflow 引擎的核心思想Qƈ允许一个简?XML 文g解释工作业务流E?/p>

OSWorkflow 核心概念
   
stepQ步骤)
    一?step 是工作流所处的位置。可能从一?step {到另外一?stepQ或者有时候还是停留在一L stepQ。D例来_一?OA pȝ的请假流E,它的 step 名称可能有“本部门审批阶段”,“办公室审批阶段”,“ȝ理审扚wD”等?br /> 
statusQ状态)
    工作?status 是一个用来描q工作流E中具体步骤状态的字符丌ӀOSWorkflow 的有 UnderwayQ进行中Q、QueuedQ等候处理中Q、FinishedQ完成)三种 status?br /> 
actionQ动作)
    action 指定了可能发生在 step 内的转变Q会D step 的变更。在 OA pȝ中,“本部门审批阶段”可能有“拒l”或“批准”两?action。action ?step 之间的关pLQstep 说明“在哪里”,action 说明“可以去哪里”?一?action 典型地由两部分组成:可以执行此动作的 conditionQ条ӞQ以及执行此动作?resultQ结果)?br /> 
conditionQ条Ӟ
    cM于逻辑判断Q可包含“AND”和“OR”逻辑。比如一个请假流E中的“本部门审批阶段”,该阶D利用“AND”逻辑Q判断流E状态是否ؓ{候处理中Q以及审批者是否ؓ本部门主?br />   
resultQ结果)
    Result 代表指向新的 step 及其 step statusQ也可能q入 split 或?join。Result 分ؓ两种Q?contidional-result Q有条gl果Q,只有条g为真时才使用该结果,?unconditional-resultQ无条gl果Q,当条件不满或没有条件时使用该结果?/p>

split/joinQ分?q接Q?/strong>
程的切分和融合。很单的概念Qsplit 提供多个 resultQjoin 则判断多?current step 的状态,提供一?result?/p>

OSWorkflow 包用途分析及代码片断
   
com.opensymphony.workflow
    该包为整?OSWorkflow 引擎提供核心接口。例?com.opensymphony.workflow.Workflow 接口Q可以说Q实际开发中的大部分工作都是围绕该接口展开的,该接口有 BasicWorkflow、EJBWorkflow、OfbizWorkflow 三个实现cR?/p>

com.opensymphony.workflow.basic
    该包有两个类QBasicWorkflow ?BasicWorkflowContext。BasicWorkflow 不支持事务,管依赖持久实现Q事务也不能包裹它。BasicWorkflowContext 在实际开发中很少使用?/p>

  public void setWorkflow(int userId) {
  Workflow workflow = new BasicWorkflow(Integer.toString(userId));
 }

com.opensymphony.workflow.config
    该包有一个接口和两个该接口的实现cR在 OSWorkflow 2.7 以前Q状态由多个地方的静态字D늻护,q种方式很方便,但是有很多缺陷和U束。最主要的缺Ҏ无法通过不同配置q行多个 OSWorkflow 实例。实现类 DefaultConfiguration 用于一般的配置文g载入。?SpringConfiguration 则是?Spring 容器理配置信息?/p>

  public void setConfiguration(SpringConfiguration configuration) {
  SpringConfiguration configuration = configuration;
workflow.setConfiguration(configuration);
 }

com.opensymphony.workflow.ejb
    该包有两个接?WorkflowHome ?WorkflowRemote。该包的若干cMQ最重要的是 EJBWorkflowQ该cd BasicWorkflow 的作用一P?OSWorkflow 的核心,q利?EJB 容器理事务Q也作ؓ工作?session bean 的包装器?/p>

com.opensymphony.workflow.loader
    该包有若q类Q用得最多的?XxxxDescriptorQ如果在工作引擎运行时需要了解指定的动作、步骤的状态、名字,{信息时Q这些描q符会v到很大作用?/p>

  public String findNameByStepId(int stepId,String wfName) {
  WorkflowDescriptor wd = workflow.getWorkflowDescriptor(wfName);
  StepDescriptor stepDes = wd.getStep(stepId);
  return stepDes.getName();
 }

com.opensymphony.workflow.ofbiz
    OfbizWorkflow ?BasicWorkflow 在很多方面非常相|除了需要调?ofbiz ?TransactionUtil 来包装事务?/p>

com.opensymphony.workflow.query
    该包主要为查询而设计,但不是所有的工作存储都支持查询。通常QHibernate ?JDBC 都支持,而内存工作流存储不支持。值得注意的是 Hibernate 存储不支持؜合型查询Q例如,一个查询同时包含了 history step 上下文和 current step 上下文)。执行一个查询,需要创?WorkflowExpressionQuery 实例Q接着调用 Workflow 对象?query Ҏ来得到最l查询结果?/p>

  public List queryDepAdmin(int userId,int type) {
  int[] arr = getSubPerson(userId,type);

  //构造表辑ּ
  Expression[] expressions = new Expression[1 + arr.length];
  Expression expStatus = new FieldExpression(FieldExpression.STATUS,
    FieldExpression.CURRENT_STEPS, FieldExpression.EQUALS, "Queued");
  expressions[0] = expStatus;

  for (int i = 0; i < arr.length; i++) {
   Expression expOwner = new FieldExpression(FieldExpression.OWNER,
     FieldExpression.CURRENT_STEPS, FieldExpression.EQUALS,
     Integer.toString(arr[i]));
   expressions[i + 1] = expOwner;
  }

  //查询未完成流~号
  List wfIdList = null;
  try {
   WorkflowExpressionQuery query = new WorkflowExpressionQuery(
     new NestedExpression(expressions, NestedExpression.AND));
   wfIdList = workflow.query(query);
  } catch (Exception e) {
   e.printStackTrace();
  }


com.opensymphony.workflow.soap
    OSWorkflow 通过 SOAP 来支持远端调用。这U调用借助 WebMethods 实现?

com.opensymphony.workflow.spi
    该包可以说是 OSWorkflow 与持久层打交道的途径Q如当前工作的实体Q其中包括:EJB、Hibernate、JDBC、Memory、Ofbiz、OJB、Prevayler?/p>

  HibernateWorkflowEntry hwfe = (HibernateWorkflowEntry) getHibernateTemplate()
     .find("from HibernateWorkflowEntry where Id="
         + wfIdList.get(i)).get(0);

com.opensymphony.workflow.util
该包?OSWorkflow 的工具包Q包括了?BeanShell、BSF、EJB Local、EJB Remote、JNDI 的支持?/p>

?l?/strong>

    ׃本h所在公司希望在 OA pȝ中引入工作流引擎Q经q分析决定采?OSWorkflow 引擎。利?OSWorkflowQ已l在pȝ中实C请假条流E原型,该流E结?OA pȝ中已有的 RBAC 模型q行逐审核。我个h认ؓ要用 OSWorkflow 让某个流E跑hg很麻烦,主要是需要扩展和自己实现的太多?br />   
    另外Q引用一D?Quake Wang 的原话:电子政务/OA 如果要用workflow engine的话QsharkQjbpm 之类的workflow engine有点杀鸡用牛刀的味道。shark ?jbpm 都强q你使用它的用户模型Q怎样把企业现有的用户模型Q包括组l结构)映射q来是很J琐的事情,比如常见?OA 应用中,甌者对应的部门负责Zؓ下一个流E的人工参与者,使用 shark 或?jbpm 都得l一圈,通过现有的h力资源系l,获得用户Q再对应q来。这q仅仅是一个简单的需求,更不用说国内企业千奇百怪的l织l构Q以及各U特D流E,?wfmc 或者其他所谓的 workflow 通用标准d不怎么标准的事情。吃力不讨好。用 osworkflow q种Z状态机?workflow engine 反而会L很多Q而且它也没有你用它的用h型。另外纠正一点:osworkflow 不仅仅支持简单的 BeanShellQ还支持 java classQbsfQejb。如果做电子政务/OA 的话Q觉得目?osworkflow 是最适用?opensource workflow engine?br />

h意!引用、{贴本文应注明原作者:Rosen Jiang 以及出处Q?/font>http://www.tkk7.com/rosen



Rosen 2005-08-12 09:59 发表评论
]]>
RBAC 模型初探http://www.tkk7.com/rosen/archive/2005/08/12/9879.htmlRosenRosenFri, 12 Aug 2005 01:56:00 GMThttp://www.tkk7.com/rosen/archive/2005/08/12/9879.htmlhttp://www.tkk7.com/rosen/comments/9879.htmlhttp://www.tkk7.com/rosen/archive/2005/08/12/9879.html#Feedback0http://www.tkk7.com/rosen/comments/commentRss/9879.htmlhttp://www.tkk7.com/rosen/services/trackbacks/9879.html 讉K控制背景

    讉K控制技术是q国国防部QDepartment of Defense, DoDQ资助的研究和开发成果演变而来的。这一研究D两种基本cd讉K控制的生:自主讉K控制QDiscretionary Access Control, DACQ和强制讉K控制QMandatory Access Control, MACQ。最初的研究和应用主要是Z防止机密信息被未l授权者访问,q期的应用主要是把这些策略应用到为商业领域?/p>

    自主讉K控制Q允许把讉K控制权的授予和取消留l个体用h判断。ؓ没有讉K控制权的个体用户授予和废除许可。自主访问控制机制允许用戯授权?br />取消讉K其控制之下的M客体QobjectQ,换句话说Q用户就是他们控制下的客体的拥有者。然而,对于多数l织来说Q最l用户对所讉K的信息没有拥有权。对于这些组l,公司或代理机构是事实上的pȝ客体和处理他们的E序的拥有者。访问优先权受组l控Ӟ而且也常常基于雇员功能而不是数据所有权?/p>

   强制讉K控制Q在国国防?Trusted Computer Security Evaluation Criteria (TCSEC) 中定义如下:“一U限制访问客体的手段Q它以包含在q些客体中的信息敏感性和讉Kq些敏感性信息的M的正式授权信息(如清除)为基”?br />  
   以上讉K控制{略对于处理一些无需保密但又敏感的信息的政府和行业组l的需求ƈ不是特别的适合。在q样的环境下Q安全目标支持生于现有法律、道徯范、规章、或一般惯例的高端l织{略。这些环境通常需要控制个体行为的能力Q而不仅仅是如何根据信息的敏感性ؓ其设|标{从而访问这一信息的个力?br />    


什么是Z角色讉K控制QRole-Based Access Control, RBACQ?NIST 有如下定义?br />   
   讉K是一U利用计机资源d某g事情的的能力Q访问控制是一U手D,通过它这U能力在某些情况下被允许或者受限制Q通常是通过物理上和Zpȝ的控Ӟ。基于计机的访问控制不仅可规定是“谁”或某个操作有权使用特定pȝ资源Q而且也能规定被允许的讉Kcd。这些控制方式可在计机pȝ或者外部设备中实现?br />  
    基于角色访问控制而言Q访问决{是Z角色的,个体用户是某个组l的一部分。用户具有指z角色Q比如医生、护士、出U뀁经理)。定义角色的q程应该Z对组l运转的d分析Q应该包括来自一个组l中更广范围用户的输入?br />   
    讉K权按角色名分l,资源的用受限于授权l假定关联角色的个体。例如,在一个医院系l中Q医生角色可能包括进行诊断、开据处斏V指C实验室化验{;而研I员的角色则被限制在攉用于研究的匿名床信息工作上?br />   
    控制讉K角色的运用可能是一U开发和加强企业Ҏ安全{略Q进行安全管理过E流E化的有效手Dc?br />     


用户QUserQ和角色QRoleQ?/font>

    用户指访问系l中的资源的MQ一般ؓ人,也可?Agent {智能程序。角色指应用领域内一U权力和责Q的语义综合体Q可以是一个抽象概念,也可以是对应于实际系l中的特定语义体Q比如组l内部的职务{。针对角色属性的不同Q某些模型中角色进一步细分ؓ普通角色和理员角Ԍ可理解ؓ全局角色Q?/p>

许可QPermissionsQ和权限QPermissionQ?/strong>

    许可描述了角色对计算源的讉K和操作所h的权限,其反映的是授权的l果。比如授予某个角色对计算源有ȝ权限Q则代表了一个许可的存在Q这个许可表C:角色获取了对计算源的读许可。针Ҏ作来_其描q的是许可和操作之间的一U关联关p,而这层关pd表示了某一角色Ҏ一操作所h的权限及权限状态?/p>


     
角色和指z(AssignmentQ?/font>

    指派包含两个斚wQ用hz֒许可指派。用hz表C的是,用hz特定的角艌Ӏ许可指z表C的是ؓ角色指派计算源的讉K和操作许可?/p>

会话QsessionQ?/font>

    会话表示的是用户和角色之间的关系。用hơ必通过建立会话来激z角Ԍ得到相应的访问权限?/p>

角色和角色等U(Role HierarchiesQ?/font>

    角色本n仅仅只是一个名词,其本wƈ不能代表权限的大。比如,我们可以定一个“Director”的角色Q也可以定一个“Project Leader”的角色。对于现实中我们来说Q看到这样两个角Ԍ清?DIR 的权限要比一?PL 的权限别高。但是对计算机来_q两个角色仅仅是两个“词语”,是等同的。可以采用分{角色Q在角色上实现层ơ化来解册些问题。也可以采用复合角色Q其表示的就是一个角色组的概念)Q对角色实现一定的分组和复合,以便于权限指z。在一?OA 产品中经常出现分{角色?br />   


限制QConstraintsQ?/strong>
   
    模型中的职责分离关系QSeparation of DutyQ,用于控制冲突QConflictQ。静态职责分(Static SDQ指定角色的互斥关系Q用于用hzNDc避免同一用户拥有互斥的角艌Ӏ实现简单,角色互斥语义关系清楚Q便于管理不够灵z,不能处理某些实际情况。动态职责分(Dynamic SDQ指定角色的互斥关系Q用于角色激z阶Dc允许同一用户拥有某些互斥的角Ԍ但是不允许该用户同时ȀzM斥的角色。更灉|Q直接与会话挂钩Q适应实际理需要,实现复杂Q不易管理?/p>

              rbac.jpg

 

参考文?/strong>

《AN INTRODUCTION TO ROLE-BASED ACCESS CONTROL?NIST

《工作流授权控制模型》      ?胡长?/p>

《基于角色的权限理lD?俞诗?/p>

 

最后,感谢徐俊刚博士对本文译提供的指对{  ?


h意!引用、{贴本文应注明原作者:Rosen Jiang 以及出处Q?/font>http://www.tkk7.com/rosen



Rosen 2005-08-12 09:56 发表评论
]]>
有限状态机QFSMQ初?/title><link>http://www.tkk7.com/rosen/archive/2005/08/12/9878.html</link><dc:creator>Rosen</dc:creator><author>Rosen</author><pubDate>Fri, 12 Aug 2005 01:54:00 GMT</pubDate><guid>http://www.tkk7.com/rosen/archive/2005/08/12/9878.html</guid><wfw:comment>http://www.tkk7.com/rosen/comments/9878.html</wfw:comment><comments>http://www.tkk7.com/rosen/archive/2005/08/12/9878.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/rosen/comments/commentRss/9878.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/rosen/services/trackbacks/9878.html</trackback:ping><description><![CDATA[ <p>NIST Ҏ限状态机QFinite State Machine, FSMQ的定义如下?br />  <br />    包含一l状态集QstatesQ、一个v始状态(start stateQ、一l输入符号集QalphabetQ、一个映输入符号和当前状态到下一状态的转换函数Qtransition functionQ的计算模型。当输入W号Ԍ模型随即q入起始状态。它要改变到新的状态,依赖于{换函数。在有限状态机中,会有许多变量Q例如,状态机有很多与动作QactionsQ{?Mealy?或状态(摩尔机)兌的动作,多重起始状态,Z没有输入W号的{换,或者指定符号和状态(非定有限状态机Q的多个转换Q指z接收状态(识别者)的一个或多个状态,{等?/p> <p>    一个例?/p> <p>              <img height="233" alt="400px-Fsm_parsing_word_nice.jpg" src="http://www.tkk7.com/images/blogjava_net/rosen/400px-Fsm_parsing_word_nice.jpg" width="400" border="0" /></p> <p>    上图是一个接受?FSM 模型Q用来分析单词“nice”。该分析器只接受字符输入Q包?U状态,状态切换由输入的字W驱动。理解v来非常简单,在此不作解释了?/p> <p>    感谢宏云博士Ҏ文翻译提供的指导?br /><br /><br /><strong><font color="#ff0000" size="2">h意!引用、{贴本文应注明原作者:Rosen Jiang 以及出处Q?/font></strong><a href="/rosen"><strong><font color="#ff0000" size="2">http://www.tkk7.com/rosen</font></strong></a></p> <img src ="http://www.tkk7.com/rosen/aggbug/9878.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/rosen/" target="_blank">Rosen</a> 2005-08-12 09:54 <a href="http://www.tkk7.com/rosen/archive/2005/08/12/9878.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <p>лǵվܻԴȤ</p> <a href="http://www.tkk7.com/" title="亚洲av成人片在线观看">亚洲av成人片在线观看</a> <div class="friend-links"> </div> </div> </footer> վ֩ģ壺 <a href="http://zg8k.com" target="_blank">aëƬȫ</a>| <a href="http://vvv75.com" target="_blank">99999þþþþ</a>| <a href="http://1111xxxx.com" target="_blank">ɫAëƬѿ</a>| <a href="http://wwwnewhtbook.com" target="_blank">鶹˾Ʒ</a>| <a href="http://116603a.com" target="_blank">޹AVվ</a>| <a href="http://www-006688.com" target="_blank">**ëƬֱ߲</a>| <a href="http://pyjxyey.com" target="_blank">ŮƵվ</a>| <a href="http://xieehuomh.com" target="_blank">av</a>| <a href="http://bisilover.com" target="_blank">ƬѸ</a>| <a href="http://gttest5.com" target="_blank">޹˳߹ۿ69վ</a>| <a href="http://yyfass.com" target="_blank">þùѾƷ</a>| <a href="http://sdhuamo.com" target="_blank">þպƬ</a>| <a href="http://78avai.com" target="_blank">һ߹ۿѸ߹ۿ</a>| <a href="http://9ts9.com" target="_blank">˳վձƬ</a>| <a href="http://wwwayx2026.com" target="_blank">弶ëƬѲ</a>| <a href="http://yzxjk.com" target="_blank">һëƬƬƵֻ</a>| <a href="http://x3013.com" target="_blank">ҹ޾ƷƬ </a>| <a href="http://nmgqsyg.com" target="_blank">޾Ʒþ</a>| <a href="http://jnyygs.com" target="_blank">һѿ</a>| <a href="http://zjztauto.com" target="_blank">һ˿Ƶwww߸嶯 </a>| <a href="http://sxgzjssb.com" target="_blank">ëƬa߹ۿ</a>| <a href="http://www222yy.com" target="_blank">һ</a>| <a href="http://snsdtv.com" target="_blank">Ƭѿ</a>| <a href="http://445848.com" target="_blank">ѹëƬ</a>| <a href="http://53ggk.com" target="_blank">ۺվɫɫ</a>| <a href="http://www3ratcom.com" target="_blank">ҹˬˬˬŮѹۿӰԺ</a>| <a href="http://shiliuvip.com" target="_blank">޹avһؼ</a>| <a href="http://wwwee2.com" target="_blank">һaƵ</a>| <a href="http://xyxpx.com" target="_blank">2019Ļ߹ۿ</a>| <a href="http://bjowj.com" target="_blank">޹һ߹ۿ</a>| <a href="http://ningxialanh.com" target="_blank">AV˾Ʒ</a>| <a href="http://spvec.com" target="_blank">Ʒѿþþ </a>| <a href="http://dszb0099.com" target="_blank">þˮAV뾫Ʒ</a>| <a href="http://2499m.com" target="_blank">һ</a>| <a href="http://yy9977.com" target="_blank">ƷŮͬһվ</a>| <a href="http://mottool.com" target="_blank">޹ۺϾƷ</a>| <a href="http://vastraje.com" target="_blank">޳ɫWWWþվ</a>| <a href="http://w7768.com" target="_blank">ɫɫWWW</a>| <a href="http://k67m.com" target="_blank">aëƬ߿Ƭ</a>| <a href="http://wwwse09.com" target="_blank">AVӰԺۿ</a>| <a href="http://kingleadsw.com" target="_blank">ղһ</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>