(转)ofbiz服务引擎

介绍

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

服务框架在2 版本对OFBiz不熟悉。 服务确定什么时候安置哪个的独立逻辑一同能习惯于处理生意要求的很多不同的类型当时。 服务能具有很多不同的类型: 工作流程,规章,爪哇,肥皂,BeanShell,等等 有类型爪哇的一种服务是很象它是一种静态方法的一次事件, 但是用服务框架我们不对基于网的应用限制。 服务要求输入参数在一张地图里,结果也被在一张地图里返回。 因为一张地图可以被连载并且储存或者通过HTTP(肥皂)发生,这是好的。


服务被通过服务定义确定并且被分配到一台具体的服务发动机。 每台服务发动机都负责以适当方式产生被确定的服务。 服务不给网基于什么时候不可能反应物体可提供的这允许服务跑的应用系。 这允许服务计划在特定时间运转不露面通过工作调度程序运转。

服务有能力举行其他服务。 因此,链接一大任务使重新使用现有服务非常容易的完成的小服务一同。 服务, 被使用在里 不同应用可以以创造全球服务定义文件或者服务仅限于应用确定仅仅一次可以只给那应用是限制和可提供的。

在网应用程序服务里使用对网事件有货,这允许事件保持小并且重新使用在服务框架过程中的现有的逻辑。 此外,服务可以作为哪个表明他们被允许被在聚会外边进入的'可输出'被定义。 目前有允许服务被通过肥皂弄成可提供的一块肥皂EventHandler。 遥远引用的其他形式将来可能被增加到框架。


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

服务调度员

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

服务调度员处理发送服务到它然后被产生的合适的服务发动机。 有每名实体专员的正好一ServiceDispatcher。 有在一应用内的多专员如果那里将也多调度员。 ServiceDispatcher被通过LocalDispatcher 进入。 可能有很多LocalDispatchers与ServiceDispatcher相关。 每LocalDispatcher被唯一命名并且包含它服务定义的自己的目录。 当造成LocalDispatcher的实例时,DispatchContext也被建立并且传给ServiceEngine。

LocalDispatcher与应用有关。 应用从未对ServiceDispatcher直接交谈。 LocalDispatcher 包含产生服务的API,这被通过ServiceDispather安排。 但是, 应用可以被逮捕比实际ServiceDispatcher 不同的线, 给LocalDispatcher离开保持在其他的事情中保持参考应用classloader哪个的一DispatchContext。


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

发送上下文

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

当例示时LocalDispatcher 建立DispatchContext。 这是运行时间调度员上下文。 它包含必要信息为每名调度员处理服务。 这上下文包含参考每个服务定义文件, 应该用于引用的classloader,提到专员和它的调度员跟一个确定的用户的' 袋'一起归因于。 这上下文转交给什么时候产生的每服务并且被调度员使用确定服务的模特。

 

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

ServiceEngine

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

这是服务竟然被产生的地方。 每种服务让人在它的定义方面说出一个发动机名字。 当被调用时,这个发动机名字被通过servicesengine.xml 文件制订并且被GenericEngineFactory用具体事例说明。 当被实现时,第三者发动机被支持并且必须跟随GenericEngine接口。 在确定发动机之后看服务发动机构造细节的指南。

处理两个同步和asynchronous 服务的引用是发动机的工作。 为asynchronous 服务使用工作调度程序的发动机能延长GenericAsyncEngine。

 


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

工作调度程序

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

被彻底检查的工作调度程序现在被和服务框架结合起来。 这是最合适的调度程序的地方。 不可能是当一个工作准备运转时,HttpServletRequest和HttpServletResponse 物体将是可得到的的保证, 和网控制人员结合起来没有意义。 以及,当被不对网环境限制时,这个特征非常有用。

调度程序是有用于应付/安排的工作并且分开用于每种服务的引用的线的一条单个的思路的一个multithreaded 零部件。 当一个工作计划运转时,调度程序将叫与工作相关的服务调度员在它自己的线里产生服务。 这将防止长或者费时的工作在队伍里减速其他工作。

调度程序现在支持重现的iCalendar对象规则结构。 工作不再被储存在一个XML 文件里,每一个是ServiceDispatcher的一部分。 有一工作调度程序适合(哪个表明在那里也只一每GenericDelegator)的每ServiceDispatcher。

它怎样工作:

最好用法调度程序的例子是一种asynchronous 服务叫。 当一种asynchronous 服务被产生时,它被传给被排队运转的工作调度程序。 一个重现入口是被建立的(RecurrenceInfo 和RecurrenceRule 实体被建立), 工作被储存,(JobSandbox 实体被建立),和上下文(地图)是被连载并且储存的(RuntimeData 实体被创造)。 调度程序然后给调度作业(asynchronous 服务没有任何延迟时间)的目录的顶添加工作并且产生。

工作不再被在一个XML 文件里确定。 这已经被移到JobSandbox 实体。 在为给队伍添加被预先规定的工作计划过程中,有一位基于网的客户,但是目前实体必须被亲手建立。


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

服务定义

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

服务被把定义为在使用中的定义文件。 有全球定义文件用于全部服务调度程序和被只地与一名单个的调度员联系起来的个人档案。 当LocalDispatcher被建立时,它被递给一次指向这些定义文件的Arils的收集。 这些文件被使用XML 创作并且确定需要产生一种服务的必要信息。 这个文件的DTD在这里可能被发现。

服务被一个独特的名字定义,对一台具体的服务发动机联系,输入和输出参数被明确地确定。 在下面是一个服务定义的例子:

< 服务名字="userLogin"发动机="java"位置="org.ofbiz.commonapp.security.login.LoginServices"产生="userLogin"><描述>证实用户名/ 密码; 创造UserLogin目标</描述><把名字归于="login.username"类型="线"方式="在方面"/><名字=,把归于 "login.password"类型="线"方式="在方面"/><把名字="userLogin"类型="org.ofbiz.entity.GenericValue"方式=归于"在外

名字 - 服务的独特的名字
发动机 - 发动机的名字(在servicesengine.xml里定义)
位置 - 服务级别的位置或者包
产生 - 服务的方法名字
auth - 做这服务要求授权(真实/错误)
出口 - 这种服务被允许被通过肥皂/ HTTP / JMS(真实/错误)进入
批准 - 我们批准为名字和类型(匹配(真实/错误))发现下面的属性
实现要素:

服务 - 这种服务实现的服务的名字。 全部属性被继承
归因于要素:

名字 - 这个属性的名字
打字 - 实体类型(线,java.util.Date,等等)
方式 - 作这输入或者产量参数或者都(穿/在外/INOUT)
可选择 - 是这个参数可选择的(真实/错误)
*强调价值是默认

在你上方能看见这种服务的名字是userLogin,它使用java 发动机。 这种服务期望用参数需要的两: 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(); }
--------------------------------------------------------------------------------

高级

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

有许多'发展'的特征被增加服务发动机。 你将关于每下面找到例子,定义和信息。


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

接口

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

接口服务发动机实现帮助确定分享许多相同的参数的服务。 一种接口服务不能被产生,而是是其他服务从继承的一种确定的服务。 每种接口服务将被使用接口发动机,例如确定:

<服务名字="testInterface"发动机="接口"位置=""产生=""><描述>考试接口服务</描述 ><把名字="partyId"类型="线"方式=归于"在方面"/><名字="partyTypeId"类型="线,把归于 "方式="on"/><"在外"把名字归于="userLoginId"类型="org.ofbiz.entity.GenericValue"方式="真实"的可选择= / **注意到位置和产生领域被在DTD里要求,因此当作为一个接口使用时,我们仅仅留下这些作为空的线。

既然我们有一个接口我们需要确定实现这个接口的一种服务

<服务名字="testExample1"发动机="简单"位置="组织/ ofbiz / commonapp /普通/SomeTestFile.xml"产生="testExample1" ><描述>考试服务实现testInterface</描述><实现服务="testInterface"/></服务>这testExample1 服务将 实现testInterface的任何服务也将继承参数/把归于。 如果需要,另外属性能被增加到一具体服务在包括时属性跟着工具标签。 你可能也通过在工具标签之后重新确定它推翻一个属性。


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

ECAs

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

ECA(事件状态行动)是很象一个扳机。 当一种服务被叫时,查找被进行看看是否任何ECAs被为这次事件确定。 事件在验证之前包括, 在参数生效,在真实服务引用之前,出于参数生效,交易犯,或者在接发球之前。 下一每状态在ECA定义内评价和全部回来为真实如果,每行动执行。 一次行动只是必须被确定在服务的上下文里已经与参数合作的一种服务。 没有对每ECA 可以确定的条件或者行动的数量的限制。

<服务eca><eca 服务="testScv"事件="犯"><状态字段名="消息"操作者="等于"估价="

要求的属性名字吗? 描述
服务Y 服务这ECA的名字附在上。
事件Y这ECA 将跑的事件可能是(以前): auth,在方面批准,在外批准,产生,承诺,或者返回。
在上运行错误N 跑的这ECA在这服务(错误的拖欠)内错误

eca 要素也应该有0种或更多条件或者条件字段要素和1种或更多行动要素。

状态标签

要求的属性名字吗? 描述
地图名字N 包含批准的领域将来自的地图的服务上下文领域的名字。 如果不确切说明字段名将被看作服务上下文字段名(一个env名字)。
字段名Y 将被比较的地图领域的名字。
操作者Y确切说明比较运算符一定是如下内容之一: 较少,更伟大,较少同等的人,伟大同等的人,等于,不等于,或者包含。
价值Y那些价值那些领域将比作。 一定是一根线,但是可能变为其他类型。
打字N要适合比较使用的数据类型。 一定是如下内容之一: 线,使加倍,漂浮,朗,整数,日期,时间,或者用时间标明。 如果没有类型被指定,默认将是线。
什么时候把线对象转化成其他数据类型,日期,次的主要的使用的形式N一形式specifier 和用时间标明。

条件字段标签

要求的属性名字吗? 描述
地图名字N 包含批准的领域将来自的地图的服务上下文领域的名字。 如果不确切说明字段名将被看作方法环境字段名(一个env名字)。
字段名Y 将被比较的地图领域的名字。
操作者Y确切说明比较运算符一定是如下内容之一: 较少,更伟大,较少同等的人,伟大同等的人,等于,不等于,或者包含。
对制订名字的N 包含被比较的领域将来自的地图的服务上下文领域的名字。 如果离开空将给地图名字,或者方法环境拖欠地图名字也未指定。
在字段名N这个名字制订领域这主要领域将被比作的那个。 如果离开空将给字段名拖欠。
打字N要适合比较使用的数据类型。 一定是如下内容之一: 线,使加倍,漂浮,朗,整数,日期,时间,或者用时间标明。 如果没有类型被指定,默认将是线。
什么时候把线对象转化成其他数据类型,日期,次的主要的使用的形式N一形式specifier 和用时间标明。

行动标签

要求的属性名字吗? 描述
服务这次行动的名字将产生的服务N。
方式Y这种服务被产生的这种方式。 可能是同步或者async。 注意到async 行动不将不断改进即使当谱成真实的时候的上下文。
如果行动服务的结果不断改进主要服务的上下文,结果对上下文的N。 准确不履行。
忽视错误的N 忽视行动服务引起的任何错误。 如果真实错误将引起原先的服务失败。 准确不履行。
坚持说N 行动服务商店/ 跑。 可能是真实或者错误的。 方式是async 只有效。 拖欠错误。

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

服务组

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

当举行最初服务时,服务组是应该运转的一套服务。 你确定一服务使用组服务发动机,并且包括的全部参数/把适合的全部服务在组内需要归于。 那些位置把归于不已经数组需要服务,产生把归于确定名字的要跑的那些组。 什么时候这几次服务产生那些组被叫和那些服务在那些组内确定被象确定的那样叫。

组定义非常简单,它跟1种或更多服务要素一起包含一种组元素。 组元素包含一名字把归于和一方式把习惯于确定组将怎样起作用归于。 服务要素是很象在ECA里的行动要素,差别是结果对上下文的默认价值。

<服务组><组名="testGroup"寄给方式="全部"><服务名字="testScv"方式= "同步"/><服务名字="testBsh"方式="同步"/></组></服务组>标签组

要求的属性名字吗? 描述
名字Y这次行动将产生的服务的名字。
送方式的N 服务(s)应该被产生的这种方式。 选择是: 没有一个,全部,首先可提供,随便,或者循环赛。 默认是全部。

服务标签

要求的属性名字吗? 描述
服务这次行动的名字将产生的服务N。
方式Y这种服务被产生的这种方式。 可能是同步或者async。 注意到async 行动不将不断改进即使当谱成真实的时候的上下文。
如果行动服务的结果不断改进主要服务的上下文,结果对上下文的N。 拖欠错误。

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

路线服务

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

路线服务被使用路线服务发动机确定。 一路线服务叫什么时候,没有产生执行,全部ECAs 确定将在适当的事件期间跑。 这类服务没被经常使用, 但是能通过利用对服务可提供的ECA 选择对其他服务习惯于' 路线'。


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

HTTP 服务

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

使用HTTP 服务是在其他系统上确定的一种产生的遥远服务的方式。 本地定义应该与遥远定义的相配, 但是使用的发动机应该是http, 位置应该是在远程系统上运行的httpService 事件的完全合格的URL, 并且产生能是这个名字是那些服务的在你请求被跑的这个远程系统上。 远程系统必须让人发起httpService 事件让HTTP 服务被接受。 因对方未出场,commonapp 网应用有这事件爬上得到要求服务。 为了允许服务被运转遥远服务在远程系统上必须有出口谱成真实。 HTTP 服务天生同步。


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

JMS 服务

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

JMS 服务是很象HTTP 服务,除服务请求之外被寄给到一个JMS 题目/排队。 发动机应该被调整到jms, 位置应该在serviceengine.xml(服役配置资料)的文件内确定的jms 服务的名字, 并且产生能是这个名字是那些服务的在你请求跑的这个远程系统上。 JMS 服务天生是asynchronous。


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

posted on 2007-07-23 01:37 hugh 阅读(1290) 评论(2)  编辑  收藏 所属分类: JAVA

评论

# re: (转)ofbiz服务引擎 2010-01-12 14:32 chain

请楼主转载文章的时候阅后转载,
很明显是金山词霸或google直翻译的文章!  回复  更多评论   

# re: (转)ofbiz服务引擎 2011-07-04 15:36 我弄你

我擦。什么乱玩意 。  回复  更多评论   


只有注册用户登录后才能发表评论。


网站导航:
 
<2010年1月>
272829303112
3456789
10111213141516
17181920212223
24252627282930
31123456

导航

统计

公告

小弟打算把硬盘里的所有资料整理到博客里,但是其中收藏了不少网上的文章(个人也记不住作者),请作者见谅!请知道作者的朋友(或作者本人)看到了请告诉小弟,小弟好把作者加上!

常用链接

留言簿(2)

随笔分类

随笔档案

收藏夹

搜索

最新评论

阅读排行榜

评论排行榜