版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
jBPM實例開發(fā)1.概述本處主要將向你展示如何用jpdl創(chuàng)建基本的流程以及如何使用API管理運行期的執(zhí)行。感謝閱讀本處的形式是解釋一組示例,每個示例集中于一個特殊的主題,并且包含大量的注釋,這精品文檔放心下載些例子也可以在jBPM下載包的目錄src/java.examples中找到。精品文檔放心下載最好的學習方法就是建立一個工程,并且通過在給定例子上做不同的變化進行實驗。感謝閱讀對eclipsejbpm-3.0-[version].zip并且解壓到自己的謝謝閱讀系統(tǒng),然后執(zhí)行菜單“File”-->“Import…”-->“ExistingProjectintoWorkspace”,然感謝閱讀后點擊“Next”,瀏覽找到jBPM根目錄,點擊“Finish”?,F(xiàn)在,在你的工作區(qū)中就有了一個精品文檔放心下載jbpm.3工程,你可以在src/java.examples/…下找到本指南中的例子,當你打開這些例子時,謝謝閱讀你可以使用菜單“Run”-->“RunAs…”-->“JUnitTest”運行它們。感謝閱讀jBPM包含一個用來創(chuàng)作例子中展示的XML的圖形化設計器工具,你可以在“2.1下載概精品文檔放心下載述”中找到這個工具的下載說明,但是完成本指南不需要圖形化設計器工具。謝謝閱讀1.1HelloWorld示例一個流程定義就是一個有向圖,它由節(jié)點和轉(zhuǎn)換組成。Helloworld流程有三個節(jié)點,下謝謝閱讀面來看一下它們是怎樣組裝在一起的,我們以一個簡單的流程作為開始,不用使用設計器工具,謝謝閱讀下圖展示了helloworld流程的圖形化表示:精品文檔放心下載圖3.1helloworld流程圖publicvoidtestHelloWorldProcess(){精品文檔放心下載//這個方法展示了一個流程定義以及流程定義的執(zhí)行。謝謝閱讀//這個流程定義有3個節(jié)點:一個沒有命名的開始狀態(tài),精品文檔放心下載//一個狀態(tài)“s”,和一個名稱為“end”的結(jié)束狀態(tài)。精品文檔放心下載//下面這行是解析一段xml文本到ProcessDefinition對象(流程定義)。感謝閱讀//ProcessDefinition把一個流程的規(guī)格化描述表現(xiàn)為java對象。感謝閱讀ProcessDefinitionprocessDefinition=精品文檔放心下載ProcessDefinition.parseXmlString(精品文檔放心下載"<process-definition>"+"<start-state>"+"<transitionto='s'/>"+謝謝閱讀"</start-state>"+"<statename='s'>"+"<transitionto='end'/>"+謝謝閱讀"</state>"+"<end-statename='end'/>"+精品文檔放心下載"</process-definition>");//下面這行是創(chuàng)建一個流程定義的執(zhí)行。創(chuàng)建后,流程執(zhí)行有一個精品文檔放心下載//主執(zhí)行路徑(=根令牌),它定位在開始狀態(tài)。ProcessInstanceprocessInstance=精品文檔放心下載newProcessInstance(processDefinition);精品文檔放心下載//創(chuàng)建后,流程執(zhí)行有一個主執(zhí)行路徑(=根令牌)。謝謝閱讀Tokentoken=processInstance.getRootToken();精品文檔放心下載//創(chuàng)建后,主執(zhí)行路徑被定位在流程定義的開始狀態(tài)。精品文檔放心下載assertSame(processDefinition.getStartState(),token.getNode());謝謝閱讀//讓我們開始流程執(zhí)行,通過它的默認轉(zhuǎn)換離開開始狀態(tài)。謝謝閱讀token.signal();//signal方法將會把流程阻塞在一個等待狀態(tài)。精品文檔放心下載//流程執(zhí)行進入第一個等待狀態(tài)“s”,因此主執(zhí)行路徑現(xiàn)在定位感謝閱讀//在狀態(tài)“s”。assertSame(processDefinition.getNode("s"),token.getNode());謝謝閱讀//讓我們發(fā)送另外一個信號,這將通過使用狀態(tài)“s”的默認轉(zhuǎn)換謝謝閱讀//離開狀態(tài)“s”,恢復流程執(zhí)行。token.signal();//現(xiàn)在signal方法將返回,因為流程示例已經(jīng)到達結(jié)束狀態(tài)。精品文檔放心下載assertSame(processDefinition.getNode("end"),token.getNode());精品文檔放心下載}1.2數(shù)據(jù)庫示例jBPM謝謝閱讀謝謝閱讀來創(chuàng)建不同的用戶代碼,例如,一段代碼在web應用中啟動一個流程并且持久化執(zhí)行到數(shù)據(jù)庫,謝謝閱讀稍后,由一個消息驅(qū)動bean從數(shù)據(jù)庫中加載流程實例并且恢復它的執(zhí)行。精品文檔放心下載有關jBPM持久化的更多信息可以在“第7章持久化”找到。謝謝閱讀publicclassHelloWorldDbTestextendsTestCase{謝謝閱讀staticJbpmConfigurationjbpmConfiguration=null;精品文檔放心下載static{//在“src/config.files”可以找到象下面這樣的一個示例配置文件。謝謝閱讀//典型情況下,配置信息在資源文件“jbpm.cfg.xml”中,但是在這里精品文檔放心下載//我們通過XML字符串傳入配置信息。//首先我們創(chuàng)建一個靜態(tài)的JbpmConfigurationJbpmConfiguration精品文檔放心下載//可以被系統(tǒng)中所有線程所使用,這也是為什么我們可以把它安全的設置感謝閱讀//為靜態(tài)的原因。jbpmConfiguration=JbpmConfiguration.parseXmlString(謝謝閱讀"<jbpm-configuration>"+//jbpm-context機制分離了jbpm核心引擎和來自于外部環(huán)境的服務。感謝閱讀"<jbpm-context>"+"<servicename='persistence'"+感謝閱讀"factory='org.jbpm.persistence.db.DbPersistenceSer謝謝閱讀viceFactory'/>"+"</jbpm-context>"+//同樣,jbpm使用的所有資源文件在jbpm.cfg.xml中被提供。精品文檔放心下載"<stringname='resource.hibernate.cfg.xml'"+感謝閱讀"value='hibernate.cfg.xml'/>"+精品文檔放心下載"<stringname='resource.business.calendar'"+感謝閱讀"value='org/jbpm/calendar/p感謝閱讀erties'/>"+"<stringname='resource.default.modules'"+感謝閱讀"value='org/jbpm/graph/def/pe精品文檔放心下載rties'/>"+"<stringname='resource.converter'"+謝謝閱讀"value='org/jbpm/db/hibernate/perti謝謝閱讀es'/>"+"<stringname='resource.action.types'"+精品文檔放心下載"value='org/jbpm/graph/action/action.types.xml'/>"+謝謝閱讀"<stringname='resource.node.types'"+謝謝閱讀"value='org/jbpm/graph/node/node.types.xml'/>"+精品文檔放心下載"<stringname='resource.varmapping'"+精品文檔放心下載"value='org/jbpm/context/exe/jbpm.varmapping.xml'/>"精品文檔放心下載+"</jbpm-configuration>");}publicvoidsetUp(){jbpmConfiguration.createSchema();感謝閱讀}publicvoidtearDown(){jbpmConfiguration.dropSchema();感謝閱讀}publicvoidtestSimplePersistence(){謝謝閱讀//在下面調(diào)用的3個方法之間,所有的數(shù)據(jù)通過數(shù)據(jù)庫被傳遞。精品文檔放心下載//在這個測試中,這3個方法被依次執(zhí)行,因為我們想要測試一個謝謝閱讀//完整的流程情景。但是實際上,這些方法表示了對服務器的不同謝謝閱讀//請求。//因為我們以一個干凈的空數(shù)據(jù)庫開始,所以我們首先必須部署流程。感謝閱讀//事實上,這只需要由流程開發(fā)者做一次。deployProcessDefinition();精品文檔放心下載//假設在一個web應用中當用戶提交一個表單時我們起動一個流程謝謝閱讀//實例(=流程執(zhí)行)…processInstanceIsCreatedWhenUserSubmitsWebappForm();謝謝閱讀//然后,一個異步消息到達時繼續(xù)執(zhí)行。theProcessInstanceContinuesWhenAnAsyncMessageIsReceived();感謝閱讀}publicvoiddeployProcessDefinition(){謝謝閱讀//這個測試展示了一個流程定義以及流程定義的執(zhí)行。感謝閱讀//這個流程定義有3個節(jié)點:一個沒有命名的開始狀態(tài),精品文檔放心下載//一個狀態(tài)“s”,和一個名稱為“end”的結(jié)束狀態(tài)。精品文檔放心下載ProcessDefinitionprocessDefinition=精品文檔放心下載ProcessDefinition.parseXmlString(感謝閱讀"<process-definitionname='helloworld'>"+精品文檔放心下載"<start-statename='start'>"+感謝閱讀"<transitionto='s'/>"+精品文檔放心下載"</start-state>"+"<statename='s'>"+"<transitionto='end'/>"+精品文檔放心下載"</state>"+"<end-statename='end'/>"+感謝閱讀"</process-definition>");//查找在上面所配置的pojo持久化上下文創(chuàng)建器。精品文檔放心下載JbpmContextjbpmContext=jbpmConfiguration.createJbpmContext();精品文檔放心下載try{//部署流程定義到數(shù)據(jù)庫中。jbpmContext.deployProcessDefinition(processDefinition);謝謝閱讀}finally{//關閉pojo持久化上下文。這包含激發(fā)(flush)SQL語句把流程謝謝閱讀//定義插入到數(shù)據(jù)庫。jbpmContext.close();}}publicvoidprocessInstanceIsCreatedWhenUserSubmitsWebappForm(){感謝閱讀//本方法中的代碼可以被放在struts的actiong中,或JSF管理精品文檔放心下載//的bean中。//查找在上面所配置的pojo持久化上下文創(chuàng)建器。感謝閱讀JbpmContextjbpmContext=jbpmConfiguration.createJbpmContext();感謝閱讀try{GraphSessiongraphSession=jbpmContext.getGraphSession();謝謝閱讀ProcessDefinitionprocessDefinition=感謝閱讀graphSession.findLatestProcessDefinition("helloworld");謝謝閱讀//使用從數(shù)據(jù)庫中獲取的流程定義可以創(chuàng)建一個流程定義的執(zhí)行精品文檔放心下載//就象在helloworld例子中那樣(該例沒有持久化)。感謝閱讀ProcessInstanceprocessInstance=精品文檔放心下載newProcessInstance(processDefinition);感謝閱讀Tokentoken=processInstance.getRootToken();謝謝閱讀assertEquals("start",token.getNode().getName());感謝閱讀//讓我們起動流程執(zhí)行token.signal();//現(xiàn)在流程在狀態(tài)'s'。assertEquals("s",token.getNode().getName());感謝閱讀//現(xiàn)在流程實例processInstance被存儲到數(shù)據(jù)庫,謝謝閱讀//因此流程執(zhí)行的當前狀態(tài)也被存儲到數(shù)據(jù)庫。jbpmContext.save(processInstance);謝謝閱讀//以后我們可以從數(shù)據(jù)庫再取回流程實例,并且通過提供另外一個謝謝閱讀//信號來恢復流程執(zhí)行。}finally{//關閉pojo持久化上下文。jbpmContext.close();}}publicvoidtheProcessInstanceContinuesWhenAnAsyncMessageIsReceived()謝謝閱讀{//本方法中的代碼可以作為消息驅(qū)動bean的內(nèi)容。感謝閱讀//查找在上面所配置的pojo持久化上下文創(chuàng)建器。謝謝閱讀JbpmContextjbpmContext=jbpmConfiguration.createJbpmContext();謝謝閱讀try{GraphSessiongraphSession=jbpmContext.getGraphSession();感謝閱讀//首先,我們需要從數(shù)據(jù)庫中取回流程實例。//有幾個可選方法來分辨出我們在這里所要處理的流程實例。謝謝閱讀//在這個簡單的測試中,最容易的方式是查找整個流程實例列表,謝謝閱讀//這里它應該只會給我們一個結(jié)果。//首先,讓我們查找流程定義。ProcessDefinitionprocessDefinition=謝謝閱讀graphSession.findLatestProcessDefinition("helloworld");精品文檔放心下載//現(xiàn)在我們搜索這個流程定義的所有流程實例。ListprocessInstances=graphSession.findProcessInstances(processDefinition.getId()感謝閱讀);//因為我們知道在這個單元測試中只有一個執(zhí)行。//在實際情況中,可以從所到達的信息內(nèi)容中提取processInstanceId感謝閱讀//或者由用戶來做選擇。ProcessInstanceprocessInstance=謝謝閱讀(ProcessInstance)processInstances.get(0);精品文檔放心下載//現(xiàn)在我們可以繼續(xù)執(zhí)行。注意:processInstance將委托信號感謝閱讀//到主執(zhí)行路徑(=根令牌)。processInstance.signal();//在這個信號之后,我們知道流程執(zhí)行應該到達了結(jié)束狀態(tài)。謝謝閱讀assertTrue(processInstance.hasEnded());謝謝閱讀//現(xiàn)在我們可以更新數(shù)據(jù)庫中的執(zhí)行狀態(tài)。jbpmContext.save(processInstance);精品文檔放心下載}finally{//關閉pojo持久化上下文。jbpmContext.close();}}}1.3上下文示例:流程變量流程變量包含了流程執(zhí)行期間的上下文信息,流程變量與一個java.util.Map相似,它影感謝閱讀java感謝閱讀在這里的例子中我們只是展示使用變量的API,而沒有持久化。感謝閱讀有關變量的更多信息可以在“第10章上下文”中找到。謝謝閱讀//這個例子仍然從helloworld流程開始,甚至沒有修改。謝謝閱讀ProcessDefinitionprocessDefinition=謝謝閱讀ProcessDefinition.parseXmlString(感謝閱讀"<process-definition>"+"<start-state>"+"<transitionto='s'/>"+感謝閱讀"</start-state>"+"<statename='s'>"+"<transitionto='end'/>"+謝謝閱讀"</state>"+"<end-statename='end'/>"+感謝閱讀"</process-definition>");ProcessInstanceprocessInstance=精品文檔放心下載newProcessInstance(processDefinition);精品文檔放心下載//從流程實例獲取上下文實例,用來使用流程變量。ContextInstancecontextInstance=感謝閱讀processInstance.getContextInstance();謝謝閱讀//在流程離開開始狀態(tài)之前,我們要在流程實例的上下文中精品文檔放心下載//設置一些流程變量。contextInstance.setVariable("amount",newInteger(500));謝謝閱讀contextInstance.setVariable("reason","imetmydeadline");謝謝閱讀//從現(xiàn)在開始,這些流程變量與流程實例相關聯(lián)。現(xiàn)在展示由用戶代碼通過感謝閱讀//API訪問流程變量,另外,這些代碼也可以存在于動作或節(jié)點的實現(xiàn)中。精品文檔放心下載//流程變量被作為流程實例的一部分也被存儲到數(shù)據(jù)庫中。謝謝閱讀processInstance.signal();//通過contextInstance訪問流程變量。感謝閱讀assertEquals(newInteger(500),謝謝閱讀contextInstance.getVariable("amount"));感謝閱讀assertEquals("imetmydeadline",精品文檔放心下載contextInstance.getVariable("reason"));精品文檔放心下載1.4任務分配示例jBPM工作流引擎與組織模型是謝謝閱讀獨立的,所以任何一種用來計算參與者的表達式語言都是有限制的,因此,你不得不指定一個謝謝閱讀AssignmentHandler實現(xiàn),用來包含任務參與者的計算。感謝閱讀publicvoidtestTaskAssignment(){謝謝閱讀//下面的流程基于helloworld流程。狀態(tài)節(jié)點被一個task-node節(jié)點謝謝閱讀//所替換。task-nodeJPDL中的一類節(jié)點,它表示一個等待狀態(tài)并且產(chǎn)生謝謝閱讀//將要完成的任務,這些任務在流程繼續(xù)之前被執(zhí)行。精品文檔放心下載ProcessDefinitionprocessDefinition=精品文檔放心下載ProcessDefinition.parseXmlString(感謝閱讀"<process-definitionname='thebabyprocess'>"+感謝閱讀"<start-state>"+"<transitionname='babycries'to='t'/>"+謝謝閱讀"</start-state>"+"<task-nodename='t'>"+"<taskname='changenappy'>"+精品文檔放心下載"<assignmentclass='org.jbpm.tutorial.taskmgmt.NappyAssignmentHandler'/>"+謝謝閱讀"</task>"+"<transitionto='end'/>"+感謝閱讀"</task-node>"+"<end-statename='end'/>"+精品文檔放心下載"</process-definition>");//創(chuàng)建一個流程定義的執(zhí)行。ProcessInstanceprocessInstance=感謝閱讀newProcessInstance(processDefinition);謝謝閱讀Tokentoken=processInstance.getRootToken();感謝閱讀//讓我們起動流程執(zhí)行,通過默認轉(zhuǎn)換離開開始狀態(tài)token.signal();//signal方法將會把流程阻塞在一個等待狀態(tài),精品文檔放心下載//在這里,就是阻塞在task-node。assertSame(processDefinition.getNode("t"),token.getNode());謝謝閱讀//當執(zhí)行到達task-node,一個'changenappy'任務被創(chuàng)建,并且謝謝閱讀//NappyAssignmentHandler被調(diào)用,來決定任務將要分配給誰。謝謝閱讀//NappyAssignmentHandler返回'papa'。謝謝閱讀//在一個實際環(huán)境中,將使用org.jbpm.db.TaskMgmtSession中的方法精品文檔放心下載//從數(shù)據(jù)庫獲取任務。因為我們不想在這個例子中包含復雜的持久化,謝謝閱讀//所以我們僅使用這個流程實例的第一個任務實例(我們知道,在這個謝謝閱讀//測試情景,只有一個任務)。TaskInstancetaskInstance=(TaskInstance)謝謝閱讀processInstance.getTaskMgmtInstance().getTaskInstances().iterator().next();//現(xiàn)在我們檢查taskInstance是否真正的分配給了'papa'。精品文檔放心下載assertEquals("papa",taskInstance.getActorId());精品文檔放心下載//現(xiàn)在我們假設'papa'已經(jīng)完成了他的職責,并且標示任務為已完成。精品文檔放心下載taskInstance.end();//因為這是要做的最后一個任務(也是唯一一個),所以任務的完成感謝閱讀//會觸發(fā)流程實例的繼續(xù)執(zhí)行。assertSame(processDefinition.getNode("end"),token.getNode());精品文檔放心下載}1.5定制動作示例動作是一種綁定你自己的定制代碼到jBPM謝謝閱讀感謝閱讀精品文檔放心下載行觸發(fā)事件時,它們會被執(zhí)行。MyActionHandler,這個動作處理實現(xiàn)感謝閱讀實際上沒有做任何事…僅僅是設置布爾變量isExecuted為true。變量isExecuted是一個靜態(tài)感謝閱讀精品文檔放心下載證它的值。有關動作的更多信息可以在“9.5動作”中找到。//MyActionHandler是一個在jBPM流程執(zhí)行期間可以執(zhí)行用戶代碼的類。感謝閱讀publicclassMyActionHandlerimplementsActionHandler{精品文檔放心下載//在每個測試之前(在setUp方法中),isExecuted成員被設置為false。精品文檔放心下載publicstaticbooleanisExecuted=false;精品文檔放心下載//動作將設置isExecuted為true,當動作被執(zhí)行之后,單元測試會感謝閱讀//展示。publicvoidexecute(ExecutionContextexecutionContext){謝謝閱讀isExecuted=true;}}MyActionHandler.isExecuted感謝閱讀為false。//每個測試都將以設置MyActionHandler的靜態(tài)成員isExecuted精品文檔放心下載//為false開始。publicvoidsetUp(){MyActionHandler.isExecuted=false;感謝閱讀}我們將會在轉(zhuǎn)換上開始一個動作。publicvoidtestTransitionAction(){精品文檔放心下載//下面的流程與helloworld流程不同。我們在從狀態(tài)“s”到精品文檔放心下載//結(jié)束狀態(tài)的轉(zhuǎn)換上增加了一個動作。這個測試的目的就是展示感謝閱讀//集成java代碼到一個jBPM流程是多么的容易。精品文檔放心下載ProcessDefinitionprocessDefinition=精品文檔放心下載ProcessDefinition.parseXmlString(謝謝閱讀"<process-definition>"+"<start-state>"+"<transitionto='s'/>"+精品文檔放心下載"</start-state>"+"<statename='s'>"+"<transitionto='end'>"+感謝閱讀"<actionclass='org.jbpm.tutorial.action.MyActionHandler'感謝閱讀/>"+"</transition>"+"</state>"+"<end-statename='end'/>"+感謝閱讀"</process-definition>");//讓我們?yōu)榱鞒潭x起動一個新的執(zhí)行。ProcessInstanceprocessInstance=感謝閱讀newProcessInstance(processDefinition);感謝閱讀//下面的信號會導致執(zhí)行離開開始狀態(tài),進入狀態(tài)“s”。謝謝閱讀processInstance.signal();//這里我們展示MyActionHandler還沒有被執(zhí)行。謝謝閱讀assertFalse(MyActionHandler.isExecuted);精品文檔放心下載//...并且執(zhí)行的主路徑被定位在狀態(tài)“s”。assertSame(processDefinition.getNode("s"),謝謝閱讀processInstance.getRootToken().getNode());謝謝閱讀//下面的信號將觸發(fā)根令牌的執(zhí)行,令牌將會執(zhí)行帶有動作的轉(zhuǎn)換,精品文檔放心下載//并且在調(diào)用signal方法期間動作經(jīng)會被執(zhí)行token。謝謝閱讀processInstance.signal();//我們可以看到MyActionHandler在調(diào)用signal方法期間被執(zhí)行了。謝謝閱讀assertTrue(MyActionHandler.isExecuted);精品文檔放心下載}下一個例子展示了相同的動作,但是現(xiàn)在動作分別被放置在了enter-node和leave-node感謝閱讀謝謝閱讀應該放入一個event元素中。ProcessDefinitionprocessDefinition=精品文檔放心下載ProcessDefinition.parseXmlString(謝謝閱讀"<process-definition>"+"<start-state>"+"<transitionto='s'/>"+謝謝閱讀"</start-state>"+"<statename='s'>"+"<eventtype='node-enter'>"+感謝閱讀"<actionclass='org.jbpm.tutorial.action.MyActionHandler'/>"精品文檔放心下載+"</event>"+"<eventtype='node-leave'>"+精品文檔放心下載"<actionclass='org.jbpm.tutorial.action.MyActionHandler'/>"精品文檔放心下載+"</event>"+"<transitionto='end'/>"+感謝閱讀"</state>"+"<end-statename='end'/>"+精品文檔放心下載"</process-definition>");ProcessInstanceprocessInstance=感謝閱讀newProcessInstance(processDefinition);謝謝閱讀assertFalse(MyActionHandler.isExecuted);謝謝閱讀//下面的信號會導致執(zhí)行離開開始狀態(tài),進入狀態(tài)“s”,感謝閱讀//因此狀態(tài)'s'被進入,動作被執(zhí)行。processInstance.signal();assertTrue(MyActionHandler.isExecuted);謝謝閱讀//我們重新設置MyActionHandler.isExecuted。精品文檔放心下載MyActionHandler.isExecuted=false;謝謝閱讀//下一個信號將會觸發(fā)執(zhí)行離開狀態(tài)'s',因此動作將被執(zhí)行。謝謝閱讀processInstance.signal();//請看assertTrue(MyActionHandler.isExecuted);感謝閱讀第5章部署jBPM是一個嵌入式BPM引擎,這意味著你可以象安裝一個獨立的軟件產(chǎn)品并集成一樣把精品文檔放心下載jBPM嵌入到你自己的javajbpm感謝閱讀庫及其依賴。5.1Java運行環(huán)境jBPM3要求J2SE1.4.2+5.2jBPM庫jbpm-[version].jar是核心功能庫。jbpm-identity-[version].jar是包含在“11.11身份組件”中描述的身份組件的庫(可謝謝閱讀選的)。5.3第三方庫commons-logging和dom4j庫到你的classpath,謝謝閱讀就可以使用jBPM創(chuàng)建和運行流程,但是這樣不支持流程的持久化。如果你不使用流程的xml解感謝閱讀析,可以移除dom4j庫,改為編程創(chuàng)建對象圖。表格5.1庫用途描述目錄commons-logging.jar在jBPM和jBPM代碼日志記錄到lib/jboss(感謝閱讀hibernate中commonslogging,從感謝閱讀記錄日至。commonslogging庫可jboss4.0.3)謝謝閱讀以被配置為分發(fā)日志到java1.4日志、log4j、…等等,有關怎樣配置commonslogging的更多信息請看apachecommons用戶指南。如果你使用log4j,最簡單的方式就是把log4j庫和一個perties放置到classpath,commonslogging將會自動檢測并使用該配置。Dom4j-1.6.1.jar流程定義和Xml解析。lib/dom4j感謝閱讀hibernate持久化。jBPM的典型部署中將包括流程定義和流程執(zhí)行的持久化,在這種情況下,jBPM除了對感謝閱讀hibernate及其所依賴庫之外不再有任何其他依賴。感謝閱讀當然,hibernatehibernate精品文檔放心下載文檔。下表給出了一個普通POJO部署環(huán)境下的指示。精品文檔放心下載jBPM的發(fā)布使用hibernate3.1,但是它也可以使用3.0.x,如果那樣的話,你不得不在精品文檔放心下載hibernate.queries.hbm.xml配置文件中更新一些hibernate謝謝閱讀請看“7.6自定義查詢”。表格5.2庫用途描述目錄hibernate3.jarhibernat最好的lib/hibernate(hibernate3感謝閱讀e持久化。O/R映射.1)器。antlr-2.7.5H3.jar由解析庫。lib/jboss(從jboss4.0.3)精品文檔放心下載hibernate持久化的查詢分析使用。cglib-2.1_2jboss.jarhibernathibernatlib/jboss(從jboss4.0.3)感謝閱讀e持久化。e代理所使用的反射庫。Commons-collection.jahibernatlib/jboss(從jboss4.0.3)精品文檔放心下載re持久化。ehcache-1.1.jarhibernat二級緩存lib/hibernate謝謝閱讀e持久化實現(xiàn),當(默認配為置)。hibernate配置不同的的緩存時,不需要本庫。jaxen-1.1-beta-4.jar流程定義XPath庫lib/hibernate謝謝閱讀和(由hiberantdom4j使e持久化。用)。jdbc2_0-stdext.jarhibernatlib/hibernate精品文檔放心下載e持久化。asm.jarhibernatasm字節(jié)lib/hibernate精品文檔放心下載e持久化。碼庫。asm-attrs.jarhibernatasm字節(jié)lib/hibernate感謝閱讀e持久化。碼庫。beanshellbeanshell集成到jbpm流程語言中感謝閱讀使用,并且你將會得到一個日志信息說“jbpm不能加載Script類,因此script元素不能使感謝閱讀用”。表格5.3庫用途描述目錄bsh-.jbeanshell腳本解只用在script和decisionlib/jboss精品文檔放心下載ar釋程序。元素中,當你不使用這些流程元素時,可以移除beanshell庫,但是必須在hibernate.cfg.xml文件中注釋掉Sceipt.hbm.xml映射行。第6章配置jBPM配置由java類org.jbpm.JbpmConfigurationJbpmConfiguration的最精品文檔放心下載簡單方式是使用單態(tài)實例方法JbpmConfiguration.getInstance()。精品文檔放心下載如果你想從另外一個源加載配置,你可以使用JbpmConfiguration.parseXxxx方法。精品文檔放心下載staticJbpmConfingurationjbpmConfiguration=感謝閱讀JbpmConfinguration.getInstance();感謝閱讀JbpmConfiguration是線程安全的,因此可以在一個靜態(tài)成員中維護,所有的線程都可以感謝閱讀把JbpmConfiguration作為一個JbpmContext對象的工廠來使用。JbpmContext表示一個事務,謝謝閱讀在一個上下文塊中JbpmContext使服務可用,上下文塊如下:感謝閱讀JbpmContextjbpmContext=jbpmConfiguration.createJbpmContext();謝謝閱讀try{//Thisiswhatwecallacontextblock.感謝閱讀//Hereyoucanperformworkflowoperations謝謝閱讀}finally{jbpmContext.close();}JbpmContext使一組服務和配置為jBPM可用,這些服務在jbpm.cfg.xml配置文件中被配精品文檔放心下載置,并且使jBPM無論運行在任何java環(huán)境中這些服務都可用。感謝閱讀下面是JbpmContext的一個典型配置,就象你在src/config.files/jbpm.cfg.xml中看到感謝閱讀的那樣:<jbpm-configuration><jbpm-context><servicename='persistence'精品文檔放心下載factory='org.jbpm.persistence.db.DbPersistenceServiceFactory'/>精品文檔放心下載<servicename='message'factory='org.jbpm.msg.db.DbMessageServiceFactory'/>精品文檔放心下載<servicename='scheduler'factory='org.jbpm.scheduler.db.DbSchedulerServiceFactory'/>精品文檔放心下載<servicename='logging'factory='org.jbpm.logging.db.DbLoggingServiceFactory'/>精品文檔放心下載<servicename='authentication'感謝閱讀factory='org.jbpm.security.authentication.DefaultAuthenticationServic精品文檔放心下載eFactory'/></jbpm-context><!--configurationresourcefilespointingtodefaultconfiguration精品文檔放心下載filesinjbpm-{version}.jar-->謝謝閱讀<stringname='resource.hibernate.cfg.xml'value='hibernate.cfg.xml'精品文檔放心下載/><!--<stringname='perties'謝謝閱讀value='perties'/>-->精品文檔放心下載<stringname='resource.business.calendar'感謝閱讀value='org/jbpm/calendar/perties'/>感謝閱讀<stringname='resource.default.modules'感謝閱讀value='org/jbpm/graph/def/perties'/>精品文檔放心下載<stringname='resource.converter'謝謝閱讀value='org/jbpm/db/hibernate/perties'/>謝謝閱讀<stringname='resource.action.types'精品文檔放心下載value='org/jbpm/graph/action/action.types.xml'/>精品文檔放心下載<stringname='resource.node.types'謝謝閱讀value='org/jbpm/graph/node/node.types.xml'/>精品文檔放心下載<stringname='resource.parsers'精品文檔放心下載value='org/jbpm/jpdl/par/jbpm.parsers.xml'/>精品文檔放心下載<stringname='resource.varmapping'精品文檔放心下載value='org/jbpm/context/exe/jbpm.varmapping.xml'/>謝謝閱讀<intname='jbpm.byte.block.size'value="1024"singleton="true"/>謝謝閱讀<beanname='jbpm.task.instance.factory'謝謝閱讀class='org.jbpm.taskmgmt.impl.DefaultTaskInstanceFactoryImpl'感謝閱讀singleton='true'/><beanname='jbpm.variable.resolver'精品文檔放心下載class='org.jbpm.jpdl.el.impl.JbpmVariableResolver'singleton='true'謝謝閱讀/><longname='jbpm.msg.wait.timout'value='5000'singleton='true'/>精品文檔放心下載</jbpm-configuration>在這個配置中你可以看到三部分:l第一部分使用一組服務實現(xiàn)配置jbpm謝謝閱讀章節(jié)中做了描述。l第二部分是所有配置資源的引用映射,如果你想要定制某些配置文件,這些資源引用可以被謝謝閱讀修改。典型情況下,你可以在jbpm-3.x.jar中拷貝一個默認的配置,并且把它放在classpath謝謝閱讀中的某個位置,然后在這個文件中修改引用為你自己定制版本的配置文件。感謝閱讀l第三部分是在jbpm謝謝閱讀缺省配置的一組服務被定位于一個簡單的web應用環(huán)境和最小的依賴,持久化服務將獲得謝謝閱讀一個jdbc連接,所有其他服務將會使用這個相同的連接來完成它們的服務,因此,工作流的所謝謝閱讀有操作都被集中到一個JDBC連接的一個事務中,不再需要事務管理器。精品文檔放心下載JbpmContext包含為大多流程操作所提供的方便方法:謝謝閱讀publicvoiddeployProcessDefinition(ProcessDefinition精品文檔放心下載processDefinition){...}publicListgetTaskList(){...}謝謝閱讀publicListgetTaskList(StringactorId){...}精品文檔放心下載publicListgetGroupTaskList(ListactorIds){...}謝謝閱讀publicTaskInstanceloadTaskInstance(longtaskInstanceId){...}感謝閱讀publicTaskInstanceloadTaskInstanceForUpdate(longtaskInstanceId)精品文檔放心下載{...}publicTokenloadToken(longtokenId){...}精品文檔放心下載publicTokenloadTokenForUpdate(longtokenId){...}謝謝閱讀publicProcessInstanceloadProcessInstance(longprocessInstanceId)感謝閱讀{...}publicProcessInstanceloadProcessInstanceForUpdate(long精品文檔放心下載processInstanceId){...}publicProcessInstancenewProcessInstance(String精品文檔放心下載processDefinitionName){...}精品文檔放心下載publicvoidsave(ProcessInstanceprocessInstance){...}精品文檔放心下載publicvoidsave(Tokentoken){...}感謝閱讀publicvoidsave(TaskInstancetaskInstance){...}精品文檔放心下載publicvoidsetRollbackOnly(){...}謝謝閱讀記住,XxxForUpdate方法將記錄所加載的對象為自動保存的,因此不需要再調(diào)用save方精品文檔放心下載法。指定多個jbpmjbpm上下文的name屬性必須是唯一謝謝閱讀的,可以使用JbpmConfiguration.createContext(Stringname)獲取命名的上下文。謝謝閱讀service元素定義了一個服務名稱和此服務的服務工廠,服務將只會在使用感謝閱讀JbpmContext.getServices().getService(Stringname)請求時被創(chuàng)建。感謝閱讀工廠也可以被作為一個元素來指定,而不是用屬性。那樣可以用于在工廠對象中注入一些感謝閱讀配置信息,負責解析XML的組件創(chuàng)建和裝配被調(diào)用的對象工廠。精品文檔放心下載6.1配置屬性jbpm.byte.block.sizeblob,而是作謝謝閱讀jBPM的全面嵌入能力,感謝閱讀這個參數(shù)控制了固定長度塊的大小。jbpm.task.instance.factory感謝閱讀當你想要定制TaskInstancebean并且向它添加新的屬性時,這是有必要的。請參考“11.10精品文檔放心下載定制任務實例”,指定的類必須實現(xiàn)org.jbpm.tskmgmt.TaskInstanceFactory。感謝閱讀jbpm.variable.resolver:定制jBPM在JSF表達式中尋找第一個術語的方式。精品文檔放心下載jbpm.msg.wait.timout:定制消息緩存的時間。感謝閱讀6.2配置文件下面是對在jBPM中定義的所有配置文件的簡短描述。精品文檔放心下載6.2.1Hibernate.cfg.xml文件這個文件包含hibernate配置,并且引用hibernate映射資源文件。精品文檔放心下載位置:hibernate.cfg.xml文件如果不另外在perties文件的謝謝閱讀jbpm.hibernate.cfg.xml屬性中指定,則jBPM工程中的默認hibernate配置文件在目錄精品文檔放心下載src/config.files/hibernate.cfg.xml。精品文檔放心下載6.2.2Hibernate查詢配置文件這個文件包含jBPM會話org.jbpm.db.*Session中所使用的hibernate查詢。感謝閱讀位置:org/jbpm/db/hibernate.queries.hbm.xml。精品文檔放心下載6.2.3節(jié)點類型配置文件這個文件包含了XML節(jié)點元素到節(jié)點實現(xiàn)類的映射。位置:org/jbpm/graph/node/node.types.xml。感謝閱讀6.2.4動作類型配置文件這個文件包含了XML動作元素到動作實現(xiàn)類的映射。位置:org/jbpm/graph/action/action.types.xml。精品文檔放心下載6.2.5業(yè)務日歷配置文件包含了業(yè)務時間和空閑時間的定義。位置:org/jbpm/calendar/perties。感謝閱讀6.2.6變量映射配置文件指定了流程變量(java對象)的值怎樣轉(zhuǎn)換到用于存儲到jbpm數(shù)據(jù)庫中的變量實例。謝謝閱讀位置:org/jbpm/context/exe/jbpm.varmapping.xml。感謝閱讀6.2.7轉(zhuǎn)換器配置文件指定了id到類名的映射。id被存儲到數(shù)據(jù)庫,org.jbpm.db.hibernate.ConverterEnumType感謝閱讀被用來映射id到單態(tài)對象。位置:org/jbpm/db/hibernate/perties。感謝閱讀6.2.8缺省模塊配置文件指定哪個模塊被缺省添加到一個新的流程定義ProcessDefinition。謝謝閱讀位置:org/jbpm/graph/def/perties。感謝閱讀6.2.9流程檔案解析器配置文件指定流程檔案解析的解析器。位置:org/jbpm/jpdl/par/jbpm.parsers.xml。謝謝閱讀6.3對象工廠對象工廠可以依照bean的xml精品文檔放心下載置以及組裝到一起形成一個完整的對象圖。對象工廠可以注入配置和其他bean到一個bean中。精品文檔放心下載在最簡單的形式中,對象工廠可以從這樣一個配置中創(chuàng)建基本類型和javabean:精品文檔放心下載<beans><beanname="task"class="org.jbpm.taskmgmt.exe.TaskInstance"/>謝謝閱讀<stringname="greeting">helloworld</string>感謝閱讀<intname="answer">42</int>感謝閱讀<booleanname="javaisold">true</boolean>感謝閱讀<floatname="percentage">10.2</float>精品文檔放心下載<doublename="salary">100000000.32</double>精品文檔放心下載<charname="java">j</char>精品文檔放心下載<nullname="dusttodust"/>精品文檔放心下載</beans>---------------------------------------------------------謝謝閱讀ObjectFactoryof=ObjectFactory.parseXmlFromAbove();謝謝閱讀assertEquals(TaskInstance.class,of.getNewObject("task").getClass());精品文檔放心下載assertEquals("helloworld",of.getNewObject("greeting"));精品文檔放心下載assertEquals(newInteger(42),of.getNewObject("answer"));謝謝閱讀assertEquals(Boolean.TRUE,of.getNewObject("javaisold"));謝謝閱讀assertEquals(newFloat(10.2),of.getNewObject("percentage"));謝謝閱讀assertEquals(newDouble(100000000.32),of.getNewObject("salary"));謝謝閱讀assertEquals(newCharacter('j'),of.getNewObject("java"));謝謝閱讀assertNull(of.getNewObject("dusttodust"));謝謝閱讀你也可以配置列表:<beans><listname="numbers"><string>one</string><string>two</string><string>three</string></list></beans>以及map:<beans><mapname="numbers"><entry><key><int>1</int></key><value><string>one</string></value>精品文檔放心下載</entry><entry><key><int>2</int></key><value><string>two</string></value><謝謝閱讀/entry><entry><key><int>3</int></key><value><string>three</string></valu感謝閱讀e></entry></map></beans>Bean可以使用直接成員注入和通過屬性的setter。謝謝閱讀<beans><beanname="task"class="org.jbpm.taskmgmt.exe.TaskInstance">精品文檔放心下載<fieldname="name"><string>dodishes</string></field>感謝閱讀<propertyname="actorId"><string>theotherguy</string></property>謝謝閱讀</bean></beans>Beanbean精品文檔放心下載任何對象。<beans><beanname="a"class="org.jbpm.A"/>
<refname="b"bean="a"/>感謝閱讀</beans>Bean可以使用任何構(gòu)造器構(gòu)造(構(gòu)造函數(shù))。<beans><beanname="task"class="org.jbpm.taskmgmt.exe.TaskInstance">
<constructor>感謝閱讀<parameterclass="java.lang.String">
<string>dodishes</string>謝謝閱讀</parameter><parameterclass="java.lang.String">精品文檔放心下載<string>theotherguy</string>精品文檔放心下載</parameter></constructor></bean></beans>…或者在bean上使用工廠方法…<beans><beanname="taskFactory"class="org.jbpm.UnexistingTaskInstanceFactory"精品文檔放心下載singleton="true"/><beanname="task"class="org.jbpm.taskmgmt.exe.TaskInstance">精品文檔放心下載<constructorfactory="taskFactory"method="createTask">感謝閱讀<parameterclass="java.lang.String">精品文檔放心下載<string>dodishes</string>感謝閱讀</parameter><parameterclass="java.lang.String">精品文檔放心下載<string>theotherguy</string>謝謝閱讀</parameter></constructor></bean></beans>…或者在類上使用一個靜態(tài)工廠方法…<beans><beanname="task"class="org.jbpm.taskmgmt.exe.TaskInstance">感謝閱讀<constructorfactory-class="org.jbpm.UnexistingTaskInstanceFactory"謝謝閱讀method="createTask"><parameterclass="java.lang.String">精品文檔放心下載<string>dodishes</string>感謝閱讀</parameter><parameterclass="java.lang.String">謝謝閱讀<string>theotherguy</string>感謝閱讀</parameter></constructor></bean></beans>每個命名的對象都可以使用屬性感謝閱讀廠為每個請求將總是返回相同的對象。注意,單態(tài)不能在不同對象工廠之間共享。精品文檔放心下載單態(tài)特性導致getObject和getNewObject方法間的區(qū)別,對象工廠謝謝閱讀的典型用戶將使用getNewObject,這意味著在一個新的對象圖被構(gòu)精品文檔放心下載精品文檔放心下載精品文檔放心下載謝謝閱讀對象緩存在每個getNewObject方法被調(diào)用起始會被清除。第7精品文檔放心下載章持久化Jbpm需要維護跨越長時間的流程的執(zhí)行,在這里,“長時間意味著跨越感謝閱讀精品文檔放心下載一個狀態(tài)轉(zhuǎn)到下一個狀態(tài),所以持久化的主要目的就是在等待狀態(tài)存儲流程的執(zhí)行。感謝閱讀一個流程定義可以表現(xiàn)為三種不同形式:XML、Java對象、Jbpm數(shù)據(jù)庫中記錄。執(zhí)行(運精品文檔放心下載行時)信息和日志信息可以表現(xiàn)為兩種形式:Java對象和Jbpm數(shù)據(jù)庫中的記錄。精品文檔放心下載圖7.1轉(zhuǎn)換和不同形式有關XML表示流程定義以及流程檔案的更多信息,請參考“第16章Jbpm流程定義語言謝謝閱讀(JPDL)”。關于怎樣部署流程檔案到數(shù)據(jù)庫在“第16.1.1節(jié)部署流程檔案”中可以找到。精品文檔放心下載7.1持久化API7.1.1相關配置框架持久化APIJbpmContextAPI精品文檔放心下載要像下面這樣在JbpmContext塊中使用:JbpmContextjbpmContext=jbpmConfiguration.createJbpmContext();感謝閱讀try{//Invokepersistenceoperationshere感謝閱讀}finally{jbpmContext.close();}在下文中,我們假設配置中包含如下持久化服務(如示例配置文件謝謝閱讀src/config.files/jbpm.cfg.xml):精品文檔放心下載<jbpm-configuration><jbpm-context><servicename='persistence'精品文檔放心下載factory='org.jbpm.persistence.db.DbPersistenceServiceFactory'/>精品文檔放心下載...</jbpm-context>...</jbpm-configuration>7.1.2JbpmContext中的便利方法三個普通的持久化操作是:l部署流程l啟動一個流程的執(zhí)行l(wèi)繼續(xù)一個執(zhí)行首先部署一個流程定義。典型的,這可以從圖形化流程設計器或部署流程的Ant任務直接謝謝閱讀完成,但是在這里你會看到怎樣通過編程實現(xiàn):JbpmContextjbpmContext=jbpmConfiguration.createJbpmContext();感謝閱讀try{ProcessDefinitionprocessDefinition=...;感謝閱讀jbpmContext.deployProcessDefinition(processDefinition);謝謝閱讀}finally{jbpmContext.close();}要創(chuàng)建一個新的流程執(zhí)行,我們需要指定一個要實例化執(zhí)行的流程定義,通常的作法是指謝謝閱讀定一個流程名稱,并讓Jbpm在數(shù)據(jù)庫中查找這個流程的最新版本:謝謝閱讀JbpmContextjbpmContext=jbpmConfiguration.createJbpmContext();謝謝閱讀try{StringprocessName=...;ProcessInstanceprocessInstance=感謝閱讀jbpmContext.newProcessInstance(processName);精品文檔放心下載}finally{jbpmContext.close();}要繼續(xù)一個流程執(zhí)行,我們需要從數(shù)據(jù)庫中取出這個流程實例、令牌或者任務實例,在這謝謝閱讀些POJOJbpm對象上調(diào)用一些方法,然后再把對流程實例的更新保存到數(shù)據(jù)庫中。精品文檔放心下載JbpmContextjbpmContext=jbpmConfiguration.createJbpmContext();感謝閱讀try{longprocessInstanceId=...;感謝閱讀ProcessInstanceprocessInstance=謝謝閱讀jbpmContext.loadProcessInstance(processInstanceId);精品文檔放心下載processInstance.signal();jbpmContext.save(processInstance);謝謝閱讀}finally{jbpmContext.close();}注意:如果你在JbpmContext中使用xxxForUpdate方法,則jbpmContext.save不需要再
顯式的調(diào)用,因為在jbpmContext關閉時它會被自動調(diào)用。舉例來說,假設我們要通知Jbpm一
一個非常方便的方法是使用loadTaskInstanceForUpdate方法:精品文檔放心下載JbpmContextjbpmContext=jbpmConfiguration.createJbpmContext();感謝閱讀try{longtaskInstanceId=...;感謝閱讀TaskInstancetaskInstance=精品文檔放心下載jbpmContext.loadTaskInstanceForUpdate(taskInstanceId);感謝閱讀taskInstance.end();}finally{jbpmContext.close();}正象是后臺信息一樣,下面部分解釋了Jbpm是怎樣管理持久化和使用Hibernate的。精品文檔放心下載JbpmConfiguration維護了一組服務工廠(ServiceFactory),服務工廠象前面內(nèi)容所說精品文檔放心下載的在jbpm.cfg.xml中配置,并且是lazy(懶)實例化的。當在第一次需要謝謝閱讀DbpersistenceServiceFactoryJbpmConfiguration中維護,感謝閱讀DbpersistenceServiceFactory管理一個hibernateSessionFactory,而hibernate精品文檔放心下載SessionFactory也是在第一次被請求的時候才創(chuàng)建的。謝謝閱讀圖7.2持久化相關類在調(diào)用jbpmConfiguration.createJbpmContext()方法期間,只有JbpmContext被創(chuàng)建,精品文檔放心下載這時沒有更多的持久化相關實例。JbpmContext管理一個DbPersistenceService感謝閱讀請求的時候?qū)嵗?。DbPersistenceServece管理hibernate會話(session),hibernate會話在精品文檔放心下載DbPersistenceServece中也是被Lazy(懶)創(chuàng)建的,因此結(jié)果是:一個hibernate會話只有在感謝閱讀第一個請求持久化的操作被調(diào)用時才被打開,而在這之前不會。精品文檔放心下載7.1.3高級API用法DbPersistenceService維護了一個懶實例化的hibernate精品文檔放心下載過這個hibernateJbpm暴露出的xxxSession類完成的,精品文檔放心下載例如GraphSession、SchedulerSession、LoggingSession等等,這些session類都是提交感謝閱讀hibernate查詢并且都使用下層相同的hebernate會話。精品文檔放心下載XxxxSession類也是通過JbpmContext來獲取的。感謝閱讀7.2配置持久化服務7.2.1Thehibernatesessionfactory感謝閱讀默認情況下,DbpersistenceServiceFactory將使用classpath根下的資源文件感謝閱讀hibernate.cfg.xml來創(chuàng)建hibernate會話工廠。注意:hibernate資源配置文件由感謝閱讀“jbpm.hibernate.cfg.xml”屬性指定,可以在jbpm.cfg.xml中定制。下面是默認配置:謝謝閱讀<jbpm-configuration>...<!--configurationresourcefilespointingtodefaultconfiguration謝謝閱讀filesinjbpm-{version}.jar-->謝謝閱讀<stringname='resource.hibernate.cfg.xml'謝謝閱讀value='hibernate.cfg.xml'/>精品文檔放心下載<!--<stringname='perties'感謝閱讀value='perties'/>-->謝謝閱讀...</jbpm-configuration>當屬性感謝閱讀hibernate.cfg.xml中的配置,因此我們可以使用perties文件、而不是更新謝謝閱讀hibernate.c
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 通宣理肺丸不良反應監(jiān)測-洞察分析
- 營銷數(shù)據(jù)安全與合規(guī)-洞察分析
- 新能源基礎設施建設的空間布局優(yōu)化-洞察分析
- 2025年外研銜接版八年級生物下冊月考試卷
- 2025年冀教版九年級科學上冊階段測試試卷
- 2025年滬科版八年級生物下冊階段測試試卷
- 2025年冀教新版九年級生物上冊階段測試試卷
- 2025個人股權糾紛解決與調(diào)解合同范本4篇
- 2025年滬科版八年級物理上冊階段測試試卷
- 2025年冀教版八年級生物下冊階段測試試卷
- 立項報告蓋章要求
- 2022年睪丸腫瘤診斷治療指南
- 被執(zhí)行人給法院執(zhí)行局寫申請范本
- 主變壓器試驗報告模板
- 安全防護通道施工方案
- 視覺元素對心理感知的影響
- 飯店管理基礎知識(第三版)中職PPT完整全套教學課件
- 柴油供貨運輸服務方案
- 110應急聯(lián)動預案
- 光伏發(fā)電監(jiān)理規(guī)劃
- 清洗劑msds清洗劑MSDS
評論
0/150
提交評論