(轉)ofbiz服務引擎
介紹
--------------------------------------------------------------------------------
服務框架在2 版本對OFBiz不熟悉。 服務確定什么時候安置哪個的獨立邏輯一同能習慣于處理生意要求的很多不同的類型當時。 服務能具有很多不同的類型: 工作流程,規(guī)章,爪哇,肥皂,BeanShell,等等 有類型爪哇的一種服務是很象它是一種靜態(tài)方法的一次事件, 但是用服務框架我們不對基于網的應用限制。 服務要求輸入參數在一張地圖里,結果也被在一張地圖里返回。 因為一張地圖可以被連載并且儲存或者通過HTTP(肥皂)發(fā)生,這是好的。
服務被通過服務定義確定并且被分配到一臺具體的服務發(fā)動機。 每臺服務發(fā)動機都負責以適當方式產生被確定的服務。 服務不給網基于什么時候不可能反應物體可提供的這允許服務跑的應用系。 這允許服務計劃在特定時間運轉不露面通過工作調度程序運轉。
服務有能力舉行其他服務。 因此,鏈接一大任務使重新使用現有服務非常容易的完成的小服務一同。 服務, 被使用在里 不同應用可以以創(chuàng)造全球服務定義文件或者服務僅限于應用確定僅僅一次可以只給那應用是限制和可提供的。
在網應用程序服務里使用對網事件有貨,這允許事件保持小并且重新使用在服務框架過程中的現有的邏輯。 此外,服務可以作為哪個表明他們被允許被在聚會外邊進入的'可輸出'被定義。 目前有允許服務被通過肥皂弄成可提供的一塊肥皂EventHandler。 遙遠引用的其他形式將來可能被增加到框架。
--------------------------------------------------------------------------------
服務調度員
--------------------------------------------------------------------------------
服務調度員處理發(fā)送服務到它然后被產生的合適的服務發(fā)動機。 有每名實體專員的正好一ServiceDispatcher。 有在一應用內的多專員如果那里將也多調度員。 ServiceDispatcher被通過LocalDispatcher 進入。 可能有很多LocalDispatchers與ServiceDispatcher相關。 每LocalDispatcher被唯一命名并且包含它服務定義的自己的目錄。 當造成LocalDispatcher的實例時,DispatchContext也被建立并且傳給ServiceEngine。
LocalDispatcher與應用有關。 應用從未對ServiceDispatcher直接交談。 LocalDispatcher 包含產生服務的API,這被通過ServiceDispather安排。 但是, 應用可以被逮捕比實際ServiceDispatcher 不同的線, 給LocalDispatcher離開保持在其他的事情中保持參考應用classloader哪個的一DispatchContext。
--------------------------------------------------------------------------------
發(fā)送上下文
--------------------------------------------------------------------------------
當例示時LocalDispatcher 建立DispatchContext。 這是運行時間調度員上下文。 它包含必要信息為每名調度員處理服務。 這上下文包含參考每個服務定義文件, 應該用于引用的classloader,提到專員和它的調度員跟一個確定的用戶的' 袋'一起歸因于。 這上下文轉交給什么時候產生的每服務并且被調度員使用確定服務的模特。
--------------------------------------------------------------------------------
ServiceEngine
--------------------------------------------------------------------------------
這是服務竟然被產生的地方。 每種服務讓人在它的定義方面說出一個發(fā)動機名字。 當被調用時,這個發(fā)動機名字被通過servicesengine.xml 文件制訂并且被GenericEngineFactory用具體事例說明。 當被實現時,第三者發(fā)動機被支持并且必須跟隨GenericEngine接口。 在確定發(fā)動機之后看服務發(fā)動機構造細節(jié)的指南。
處理兩個同步和asynchronous 服務的引用是發(fā)動機的工作。 為asynchronous 服務使用工作調度程序的發(fā)動機能延長GenericAsyncEngine。
--------------------------------------------------------------------------------
工作調度程序
--------------------------------------------------------------------------------
被徹底檢查的工作調度程序現在被和服務框架結合起來。 這是最合適的調度程序的地方。 不可能是當一個工作準備運轉時,HttpServletRequest和HttpServletResponse 物體將是可得到的的保證, 和網控制人員結合起來沒有意義。 以及,當被不對網環(huán)境限制時,這個特征非常有用。
調度程序是有用于應付/安排的工作并且分開用于每種服務的引用的線的一條單個的思路的一個multithreaded 零部件。 當一個工作計劃運轉時,調度程序將叫與工作相關的服務調度員在它自己的線里產生服務。 這將防止長或者費時的工作在隊伍里減速其他工作。
調度程序現在支持重現的iCalendar對象規(guī)則結構。 工作不再被儲存在一個XML 文件里,每一個是ServiceDispatcher的一部分。 有一工作調度程序適合(哪個表明在那里也只一每GenericDelegator)的每ServiceDispatcher。
它怎樣工作:
最好用法調度程序的例子是一種asynchronous 服務叫。 當一種asynchronous 服務被產生時,它被傳給被排隊運轉的工作調度程序。 一個重現入口是被建立的(RecurrenceInfo 和RecurrenceRule 實體被建立), 工作被儲存,(JobSandbox 實體被建立),和上下文(地圖)是被連載并且儲存的(RuntimeData 實體被創(chuàng)造)。 調度程序然后給調度作業(yè)(asynchronous 服務沒有任何延遲時間)的目錄的頂添加工作并且產生。
工作不再被在一個XML 文件里確定。 這已經被移到JobSandbox 實體。 在為給隊伍添加被預先規(guī)定的工作計劃過程中,有一位基于網的客戶,但是目前實體必須被親手建立。
--------------------------------------------------------------------------------
服務定義
--------------------------------------------------------------------------------
服務被把定義為在使用中的定義文件。 有全球定義文件用于全部服務調度程序和被只地與一名單個的調度員聯系起來的個人檔案。 當LocalDispatcher被建立時,它被遞給一次指向這些定義文件的Arils的收集。 這些文件被使用XML 創(chuàng)作并且確定需要產生一種服務的必要信息。 這個文件的DTD在這里可能被發(fā)現。
服務被一個獨特的名字定義,對一臺具體的服務發(fā)動機聯系,輸入和輸出參數被明確地確定。 在下面是一個服務定義的例子:
< 服務名字="userLogin"發(fā)動機="java"位置="org.ofbiz.commonapp.security.login.LoginServices"產生="userLogin"><描述>證實用戶名/ 密碼; 創(chuàng)造UserLogin目標</描述><把名字歸于="login.username"類型="線"方式="在方面"/><名字=,把歸于 "login.password"類型="線"方式="在方面"/><把名字="userLogin"類型="org.ofbiz.entity.GenericValue"方式=歸于"在外
名字 - 服務的獨特的名字
發(fā)動機 - 發(fā)動機的名字(在servicesengine.xml里定義)
位置 - 服務級別的位置或者包
產生 - 服務的方法名字
auth - 做這服務要求授權(真實/錯誤)
出口 - 這種服務被允許被通過肥皂/ HTTP / JMS(真實/錯誤)進入
批準 - 我們批準為名字和類型(匹配(真實/錯誤))發(fā)現下面的屬性
實現要素:
服務 - 這種服務實現的服務的名字。 全部屬性被繼承
歸因于要素:
名字 - 這個屬性的名字
打字 - 實體類型(線,java.util.Date,等等)
方式 - 作這輸入或者產量參數或者都(穿/在外/INOUT)
可選擇 - 是這個參數可選擇的(真實/錯誤)
*強調價值是默認
在你上方能看見這種服務的名字是userLogin,它使用java 發(fā)動機。 這種服務期望用參數需要的兩: login.username和login.password。 在服務被產生之前,要求的參數被測試。 參數不匹配用名字如果和服務沒被產生的實體類型。 可以或可以不被寄給到服務的參數應該被定義為可選擇。 以后那些服務被產生,出于參數被測試。 只要求參數測試,但是,遞給哪個不確定當可選擇和要求將引起服務失敗時如果。 這種服務不出于參數需要,因此結果僅僅被返回。
--------------------------------------------------------------------------------
用法
--------------------------------------------------------------------------------
服務框架的內部的用法十分簡單。 在Web 應用里LocalDispatcher被儲存在可以被在一次事件過程中通過會議對象訪問的ServletContext里。 對于非網來說基于應用,你僅僅建立GenericDispatcher:
GenericDelegator專員 = GenericDelegator.getGenericDelegator("默認"); LocalDispatcher調度員 = 新GenericDispatcher("UniqueName",專員); 現在我們有我們能使用產生服務的一名調度員。 為了產生試驗,服務建立包含時髦的參數消息的上下文的一張地圖然后產生服務:
地圖上下文 = UtilMisc.toMap("消息","這是一次試驗。 "); 地圖結果 = 空行; 試驗 {結果 = dispatcher.runSync("testScv",上下文); }抓住(GenericServiceException e) {e.printStackTrace(); }如果(結果!= 空行)System.out.println("起因于軍用": +(線)result.get("resp")); 現在看操縱臺并且看見試驗服務已經回響什么。
***試驗服務位于核心/ 文件/例子/ ServiceTest.java 你必須編輯這并且把它放在classpath里。
計劃一種服務最后運轉或者重復使用這:
//這個例子將計劃一個工作運轉now.Map 上下文 = UtilMisc.toMap("消息","這是一次試驗。 "); 試驗 {長的startTime = (新日期()).getTime(); dispatcher.schedule("testScv",上下文,startTime); }抓住(GenericServiceException e) {e.printStackTrace(); }//這個例子將計劃一種服務現在運轉并且每5秒共10 times.Map 上下文重復一次 = UtilMisc.toMap("消息","這是一次試驗。 "); 試驗 {長的startTime = (新日期()).getTime(); 內部的頻率 = RecurrenceRule.SECONDLY; 內部的間隔= 5; 內部的計數= 10; dispatcher.schedule("testScv",上下文,startTime,頻率,間隔,數); }抓住(GenericServiceException e) {e.printStackTrace(); }
--------------------------------------------------------------------------------
高級
--------------------------------------------------------------------------------
有許多'發(fā)展'的特征被增加服務發(fā)動機。 你將關于每下面找到例子,定義和信息。
--------------------------------------------------------------------------------
接口
--------------------------------------------------------------------------------
接口服務發(fā)動機實現幫助確定分享許多相同的參數的服務。 一種接口服務不能被產生,而是是其他服務從繼承的一種確定的服務。 每種接口服務將被使用接口發(fā)動機,例如確定:
<服務名字="testInterface"發(fā)動機="接口"位置=""產生=""><描述>考試接口服務</描述 ><把名字="partyId"類型="線"方式=歸于"在方面"/><名字="partyTypeId"類型="線,把歸于 "方式="on"/><"在外"把名字歸于="userLoginId"類型="org.ofbiz.entity.GenericValue"方式="真實"的可選擇= / **注意到位置和產生領域被在DTD里要求,因此當作為一個接口使用時,我們僅僅留下這些作為空的線。
既然我們有一個接口我們需要確定實現這個接口的一種服務
<服務名字="testExample1"發(fā)動機="簡單"位置="組織/ ofbiz / commonapp /普通/SomeTestFile.xml"產生="testExample1" ><描述>考試服務實現testInterface</描述><實現服務="testInterface"/></服務>這testExample1 服務將 實現testInterface的任何服務也將繼承參數/把歸于。 如果需要,另外屬性能被增加到一具體服務在包括時屬性跟著工具標簽。 你可能也通過在工具標簽之后重新確定它推翻一個屬性。
--------------------------------------------------------------------------------
ECAs
--------------------------------------------------------------------------------
ECA(事件狀態(tài)行動)是很象一個扳機。 當一種服務被叫時,查找被進行看看是否任何ECAs被為這次事件確定。 事件在驗證之前包括, 在參數生效,在真實服務引用之前,出于參數生效,交易犯,或者在接發(fā)球之前。 下一每狀態(tài)在ECA定義內評價和全部回來為真實如果,每行動執(zhí)行。 一次行動只是必須被確定在服務的上下文里已經與參數合作的一種服務。 沒有對每ECA 可以確定的條件或者行動的數量的限制。
<服務eca><eca 服務="testScv"事件="犯"><狀態(tài)字段名="消息"操作者="等于"估價="
要求的屬性名字嗎? 描述
服務Y 服務這ECA的名字附在上。
事件Y這ECA 將跑的事件可能是(以前): auth,在方面批準,在外批準,產生,承諾,或者返回。
在上運行錯誤N 跑的這ECA在這服務(錯誤的拖欠)內錯誤
eca 要素也應該有0種或更多條件或者條件字段要素和1種或更多行動要素。
狀態(tài)標簽
要求的屬性名字嗎? 描述
地圖名字N 包含批準的領域將來自的地圖的服務上下文領域的名字。 如果不確切說明字段名將被看作服務上下文字段名(一個env名字)。
字段名Y 將被比較的地圖領域的名字。
操作者Y確切說明比較運算符一定是如下內容之一: 較少,更偉大,較少同等的人,偉大同等的人,等于,不等于,或者包含。
價值Y那些價值那些領域將比作。 一定是一根線,但是可能變?yōu)槠渌愋汀?
打字N要適合比較使用的數據類型。 一定是如下內容之一: 線,使加倍,漂浮,朗,整數,日期,時間,或者用時間標明。 如果沒有類型被指定,默認將是線。
什么時候把線對象轉化成其他數據類型,日期,次的主要的使用的形式N一形式specifier 和用時間標明。
條件字段標簽
要求的屬性名字嗎? 描述
地圖名字N 包含批準的領域將來自的地圖的服務上下文領域的名字。 如果不確切說明字段名將被看作方法環(huán)境字段名(一個env名字)。
字段名Y 將被比較的地圖領域的名字。
操作者Y確切說明比較運算符一定是如下內容之一: 較少,更偉大,較少同等的人,偉大同等的人,等于,不等于,或者包含。
對制訂名字的N 包含被比較的領域將來自的地圖的服務上下文領域的名字。 如果離開空將給地圖名字,或者方法環(huán)境拖欠地圖名字也未指定。
在字段名N這個名字制訂領域這主要領域將被比作的那個。 如果離開空將給字段名拖欠。
打字N要適合比較使用的數據類型。 一定是如下內容之一: 線,使加倍,漂浮,朗,整數,日期,時間,或者用時間標明。 如果沒有類型被指定,默認將是線。
什么時候把線對象轉化成其他數據類型,日期,次的主要的使用的形式N一形式specifier 和用時間標明。
行動標簽
要求的屬性名字嗎? 描述
服務這次行動的名字將產生的服務N。
方式Y這種服務被產生的這種方式。 可能是同步或者async。 注意到async 行動不將不斷改進即使當譜成真實的時候的上下文。
如果行動服務的結果不斷改進主要服務的上下文,結果對上下文的N。 準確不履行。
忽視錯誤的N 忽視行動服務引起的任何錯誤。 如果真實錯誤將引起原先的服務失敗。 準確不履行。
堅持說N 行動服務商店/ 跑。 可能是真實或者錯誤的。 方式是async 只有效。 拖欠錯誤。
--------------------------------------------------------------------------------
服務組
--------------------------------------------------------------------------------
當舉行最初服務時,服務組是應該運轉的一套服務。 你確定一服務使用組服務發(fā)動機,并且包括的全部參數/把適合的全部服務在組內需要歸于。 那些位置把歸于不已經數組需要服務,產生把歸于確定名字的要跑的那些組。 什么時候這幾次服務產生那些組被叫和那些服務在那些組內確定被象確定的那樣叫。
組定義非常簡單,它跟1種或更多服務要素一起包含一種組元素。 組元素包含一名字把歸于和一方式把習慣于確定組將怎樣起作用歸于。 服務要素是很象在ECA里的行動要素,差別是結果對上下文的默認價值。
<服務組><組名="testGroup"寄給方式="全部"><服務名字="testScv"方式= "同步"/><服務名字="testBsh"方式="同步"/></組></服務組>標簽組
要求的屬性名字嗎? 描述
名字Y這次行動將產生的服務的名字。
送方式的N 服務(s)應該被產生的這種方式。 選擇是: 沒有一個,全部,首先可提供,隨便,或者循環(huán)賽。 默認是全部。
服務標簽
要求的屬性名字嗎? 描述
服務這次行動的名字將產生的服務N。
方式Y這種服務被產生的這種方式。 可能是同步或者async。 注意到async 行動不將不斷改進即使當譜成真實的時候的上下文。
如果行動服務的結果不斷改進主要服務的上下文,結果對上下文的N。 拖欠錯誤。
--------------------------------------------------------------------------------
路線服務
--------------------------------------------------------------------------------
路線服務被使用路線服務發(fā)動機確定。 一路線服務叫什么時候,沒有產生執(zhí)行,全部ECAs 確定將在適當的事件期間跑。 這類服務沒被經常使用, 但是能通過利用對服務可提供的ECA 選擇對其他服務習慣于' 路線'。
--------------------------------------------------------------------------------
HTTP 服務
--------------------------------------------------------------------------------
使用HTTP 服務是在其他系統上確定的一種產生的遙遠服務的方式。 本地定義應該與遙遠定義的相配, 但是使用的發(fā)動機應該是http, 位置應該是在遠程系統上運行的httpService 事件的完全合格的URL, 并且產生能是這個名字是那些服務的在你請求被跑的這個遠程系統上。 遠程系統必須讓人發(fā)起httpService 事件讓HTTP 服務被接受。 因對方未出場,commonapp 網應用有這事件爬上得到要求服務。 為了允許服務被運轉遙遠服務在遠程系統上必須有出口譜成真實。 HTTP 服務天生同步。
--------------------------------------------------------------------------------
JMS 服務
--------------------------------------------------------------------------------
JMS 服務是很象HTTP 服務,除服務請求之外被寄給到一個JMS 題目/排隊。 發(fā)動機應該被調整到jms, 位置應該在serviceengine.xml(服役配置資料)的文件內確定的jms 服務的名字, 并且產生能是這個名字是那些服務的在你請求跑的這個遠程系統上。 JMS 服務天生是asynchronous。
--------------------------------------------------------------------------------
posted on 2007-07-23 01:37 hugh 閱讀(1295) 評論(2) 編輯 收藏 所屬分類: JAVA