乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      osworkflow descriptor 解析 重要概念

       duduwolf 2005-08-06

      在這篇文章中,主要介紹osworkflow的核心概念以及重要的部分,讓大家對osworkflow有個(gè)比較全面的認(rèn)識(shí)。

      osworkflow中最最核心的東西就是工作流定義的xml文件。盡管它并不是一定要定義成xml文件。但是xml格式是一種標(biāo)準(zhǔn)的通用的格式。

      這個(gè)xml文件為某一個(gè)給定的工作流進(jìn)行描述stepsstates,transitions,和functionality。下面闡述一下此xml的一般規(guī)則:

      1、  一個(gè)工作流由多個(gè)steps組成

      2、  對于每個(gè)step,可以包括多個(gè)actions。一個(gè)action可以被設(shè)置成自動(dòng)運(yùn)行或者需要通過人工交互才可以運(yùn)行。

      3、  每個(gè)action都要包括至少一個(gè)unconditional result0或多個(gè)conditional results。

      4、  如果設(shè)定了多個(gè)concitioanl results,所有當(dāng)中的第一個(gè)將被執(zhí)行,如果沒有設(shè)定conditional results或者沒有conditions滿足,那么執(zhí)行unconditional result

      5、  一個(gè)result過后可能依舊停留在當(dāng)前的step中,一個(gè)新的step,一個(gè)split,一個(gè)join。在所有的情形中,工作流的state跟著變化(例子工作流中的states分別為:Underway,Queued,finished

      6、  如果一個(gè)result引起一個(gè)split,這個(gè)result會(huì)指定split的屬性,以指向一個(gè)split元素。

      7、  一個(gè)split可以有一個(gè)或者多個(gè)unconditional results,但是沒有conditional results。Unconditional results。Unconditional results需要指定steps

      8、  一個(gè)propertyset是一個(gè)持久層數(shù)據(jù)的map,在全局應(yīng)用中都是可用的。

      9、  還有一種叫做transientVarsmap,它只存活于一個(gè)工作流調(diào)用過程中的一定的生命周期,它將會(huì)對所有functionsconditions,包括所有的registers,user input,以及工作流上下文狀態(tài)等起作用。

      工作流概念:

      下面開始理解osworkflow的核心概念:

      對于stepstatus,actions部分就不多說明了,其實(shí)我覺得理解概念的最快方法應(yīng)該是參照實(shí)例,即使我們不能用高高大大的詞匯描繪出來,能自己理解是什么意思就可以了。

      Unconditional result conditional results

      這里做以簡單介紹,對于每個(gè)action,要求至少存在一個(gè)Unconditional  result,一個(gè)result也就是通過一系列指示來告訴osworkflow下一步的任務(wù)是干什么。這種調(diào)用使得產(chǎn)生變遷進(jìn)而從一個(gè)state到另外一個(gè)state。這種概念是在UML的狀態(tài)機(jī)里有講,希望了解狀態(tài)機(jī)相關(guān)概念的可以到UML相關(guān)書籍中查看。

      Conditional resultunconditional result的一種擴(kuò)展。不同的地方在于他需要一些子元素:condition。用and or來標(biāo)志各個(gè)condition之間的關(guān)系。

      Conditional unconditional 的最終result可以產(chǎn)生三種效應(yīng)或者說是結(jié)果:

      1、  一個(gè)新的step/status

      2、  一個(gè)split,出現(xiàn)一或多個(gè)step/status

      3、  一個(gè)join,一個(gè)新的step/status

      普遍的,一個(gè)split或者join不能result出另外一個(gè)splitjoin

      一個(gè)step/status result可以按下面方式簡單的設(shè)定:

      <unconditional-result old-status="Finished" step="2"

                            status="Underway" owner="${someOwner}"/>

      從一個(gè)state split 到多個(gè) states可以按以下方式達(dá)到:

      <unconditional-result split="1"/>
      ...
      <splits>
        <split id="1">
          <unconditional-result old-status="Finished" step="2" 
                                status="Underway" owner="${someOwner}"/>
          <unconditional-result old-status="Finished" step="2" 
                                status="Underway" owner="${someOtherOwner}"/>
        </split>
      </splits>

      Joins是比較復(fù)雜的用例。一個(gè)典型的join看起來大致如下:

      <!-- for step id 6 ->
      <unconditional-result join="1"/>
      ...
      <!- for step id 8 ->
      <unconditional-result join="1"/>
      ...
      <joins>
        <join id="1">
          <join id="1">
          <conditions type="AND">
            <condition type="beanshell">
              <arg name="script">
                "Finished".equals(jn.getStep(6).getStatus() 
                && "Finished".equals(jn.getStep(8).getStatus())
              </arg>
            </condition>
          </conditions>
        </join>
        <unconditional-result old-status="Finished" status="Underway" 
                                       owner="test" step="2"/>
        </join>
      </joins>

      上面這段代碼中最需要關(guān)心的就應(yīng)該是jn。當(dāng)join實(shí)際發(fā)生的時(shí)候,這個(gè)特殊的變量jn可以被用來建立表達(dá)式。本質(zhì)上,可以很容易理解出這個(gè)段xml的意思就是:當(dāng)step68finish時(shí)候在此處進(jìn)行join

      Functions部分:

      Osworkflowfunction來定義商業(yè)邏輯和一些需要定義執(zhí)行的服務(wù)。用functions標(biāo)簽來表示。

      兩種functionsprepost

      Pre 是在工作流進(jìn)行某個(gè)變遷之前需要被執(zhí)行的。一個(gè)比較好的例子:為了在resultstate變更產(chǎn)生,而先建立caller。

      Post是在之后執(zhí)行的。如當(dāng)某一個(gè)state改變后,發(fā)送一email到某處。

      Functions可以在兩個(gè)分別的地方被指定:stepsactions。

      Trigger Functions

      Validators

      Registers

      一個(gè)function:用來返回一個(gè)用以被其他普通對象能夠容易訪問得到的對象。尤其是指workflow 的實(shí)體類。返回的對象類型不閑典型的例子如:documentmetadata,issuetask等。非常便利。

      <registers>
             <register name="doc" class="com.acme.DocumentRegister"/>
      </registers>
      ...
      <results>
             <result condition="doc.priority == 1" step="1" status="Underway" 
                        owner="${someManager}"/>
             <unconditional-result step="1" status="Queued"/>
      </results>

      Conditions

      變量

      授權(quán)與限權(quán)

      自動(dòng)執(zhí)行的action

      設(shè)置auto=true

      Common and global actions

      Commonglobalactions的主要作用在于在工作流定義文件中能夠避免代碼重復(fù)。

      基本思想就是簡單。這兩種actions是在最開始就進(jìn)行說明的,在initial-actions元素后面。

      這兩處還不能完全理解好!

      Common actions:在最開始定義好,可以在其他地方如此引用

      <common-action id="100" />

      例如一個(gè)“send mail”的action

      Global actions:不同之處在于顯式的被某一個(gè)step引用。它通常對所有的steps都是可用的。一個(gè)例子:“終止工作流”,在任何一步,都有可能終止工作流。

      需要注意的是:這兩種actions要具備唯一的ID,而不能和其他actionID重復(fù)。

      接下來主要講解關(guān)于function的四種情況:

      osworkflow中的function就是可以在變遷之前或者后進(jìn)行執(zhí)行的內(nèi)容。

      1、  基于javafunctions

      classloader中加載java 類,通過jndi找會(huì)java類,遠(yuǎn)程ejbs,本地ejb。

      這一類型的function必須實(shí)現(xiàn)接口:com.opensymphony.workflow.FunctionProvider,在這個(gè)接口中有一個(gè)方法execute。這個(gè)方法(execute)需要三個(gè)參數(shù)

      可以自己去查api即可找到這三個(gè)參數(shù),兩個(gè)map一個(gè)propertyset

      基于javafunctions在以下類型是可用的。

      1)、class

      對于一個(gè)class functionclassloader必須能夠知道你的function的類名。如下:

      <function type="class">
            <arg name="class.name">com.acme.FooFunction</arg>
            <arg name="message">The message is ${message}</arg>

      </function>

      2)、jndi

      jndi function class想類似,當(dāng)然必須已經(jīng)確實(shí)存在于jndi樹中,在這里,需要一個(gè)jndi.location來進(jìn)行配置:

      <function type="jndi">
            <arg name="jndi.location">java:/FooFunction</arg>
            <arg name="message">The message is ${message}</arg>

      </function>

      3)、remote-ejb

      這部分跳過

      <function type="remote-ejb">
            <arg name="ejb.location">java:/comp/env/FooEJB</arg>
            <arg name="message">The message is ${message}</arg>

      </function>

      (4)、local-ejb

      跳過

      <function type="local-ejb">
            <arg name="ejb.location">java:/comp/env/FooEJB</arg>
            <arg name="message">The message is ${message}</arg>

      </function>

      2、  beanshell function

      osworkflow支持beanshell,這是一種腳本語言??梢栽?/SPAN>http://www./來查看beanshell的相關(guān)內(nèi)容。

      在這種情況下,需要將xml過程定義中的type設(shè)置成beanshell。另外還需要有個(gè)一個(gè)參數(shù)名字為script的參數(shù),此參數(shù)值是實(shí)際需要被執(zhí)行的。

      例如:

      <function type="beanshell">
            <arg name="script">  
                  System.out.println("Hello, World!");
            </arg>

      </function>

      三種變量:entry,context,store

      entry:實(shí)現(xiàn)com.opensymphony.workflow.spi.WorkflowEntry并且表示工作流實(shí)例。

      Contextcom.opensymphony.workflow.WorkflowContext。允許beanshell functions回滾事務(wù)或者確定callername

      Storecom.opensymphony.workflow.WorkflowStore允許function訪問工作流的持久存儲(chǔ)層。

      <function type="beanshell">
            <arg name="script">  
                  propertySet.setString("world", "Earth");
            </arg>
      </function>
      <function type="beanshell">
            <arg name="script">  
                  System.out.println("Hello, "+propertySet.getString("world"));
            </arg>

      </function>

      輸出結(jié)果是“helloearth”因?yàn)槿魏未鎯?chǔ)在propertyset中的變量將可以在整個(gè)工作流中被持久使用。

      3、  BSF function(perlscript, vbscript, javascript)

      除了上面說過的兩種typefunction。還有bsf類型的function

      BSFbean scripting framework)是IBM的一個(gè)組織做的一個(gè)通用環(huán)境可以使用VBScript, Perlscript, Python, and JavaScript

      <function type="bsf">
            <arg name="source">foo.pl</arg>
            <arg name="row">0</arg>
            <arg name="col">0</arg>
            <arg name="script">
                  print $bsf->lookupBean("propertySet").getString("foo");
            </arg>

      </function>

      個(gè)人覺得這部分可以先跳過去,知道有這么一回事就可以了。

      4、  Utility Function

      可以到apicom.opensymphony.workflow.util這部分查看。下面只是列出一些主要的功能。相當(dāng)于java.util里的東西。

      主要用于創(chuàng)建動(dòng)態(tài)的工作流定義,主要是包括一些實(shí)用功能,如callerwebworkexecutor、ejbinvoker、jmsmessagemostrecentowner、schedulejobunschdulejob、sendmail。

      這部分碰到不懂就去查api是個(gè)好辦法,這里就不去多寫的。

      validators:

      functions類似,osworkflow有下面幾種不同形式的validatorsjava-based,beanshell,和bsfJava-basedvalidators必須實(shí)現(xiàn)com.opensymphony.workflow.Validator接口(如果是remote-ejb,則需實(shí)現(xiàn)com.opensymphony.workflow.ValidatorRemote接口)。Java-based這種情況是通過拋出個(gè)InvalidInputException異常表明一個(gè)輸入是不合法的,并且停止工作流action。

      beanshellbsf中,有一點(diǎn)小小不同,即使異??梢栽谀_本中拋出,但是不能抵達(dá)到jre。所以在beanshellbsf中用錯(cuò)誤信息來完成。邏輯如下:

      u       如果返回值是一個(gè)InvalidInputException對象,這個(gè)對象立刻拋出到client。

      u       如果返回值是一個(gè)map,map被用做一個(gè)error/errormessage對。

      u       如果返回值是一個(gè)String [],偶數(shù)字被做為key。奇數(shù)做為value來構(gòu)造一個(gè)map

      u       其他情況,把值轉(zhuǎn)換成string并且作為一個(gè)普通的錯(cuò)誤信息來添加。

      Registers:

      Register是一個(gè)在工作流定義文件中用來動(dòng)態(tài)注冊的運(yùn)行時(shí)(塊)

      它也是和validators,functions差不多,都是能夠以java-based,beanshellbsf不同格式出現(xiàn)。

      Conditions:

      Conditionsosworkflow小小不相似之處在于:在bsf或者beanshell腳本中,有一個(gè)額外的對象叫做“jn”。這個(gè)jn來源于com.opensymphony.workflow.joinnodes。它的作用就是連接條件(join-conditions)。除此之外,condition必須有一個(gè)返回值(true or false)。

      Condition必須被conditions包含成為其子元素。Conditions有一個(gè)屬性type。可以為and或者or。And表示:所有condition元素必須都為true或者false。Or表示只要有一個(gè)condition元素為true。如果你需要更多復(fù)雜的condition邏輯??梢钥紤]實(shí)現(xiàn)condition或者conditionremote接口,beanshell,bsf。如果只有一個(gè)condition子元素的時(shí)候,conditionstype屬性值可以省略。

      2.7中??梢郧短?/SPAN>conditions,這樣可以讓你實(shí)現(xiàn)更為復(fù)雜的商業(yè)邏輯。

      下面是一個(gè)寫標(biāo)準(zhǔn)的conditions

      OSUserGroupCondition、StatusCondition、AllowOwnerOnlyCondition、DenyOwnerCondition

      Soap支持,暫時(shí)略!因?yàn)闀簳r(shí)可能涉及不到!

      Gui Designer部分略。

        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多