概述
    服务定义为一段独立的逻辑顺序,当多个服务组合一起时可完成不同类型的业务需求
    服务有很多类型,WorkFlow、Rules、Java、SOAP、BeanShell等。java类型的服务更像一个静态方法实现的事件,然而使用服务框架就不会局限在web应用程序中。
    服务需要使用Map传入参数,结果同样从Map中返回。这样很妙,因为Map可以被序列化并保存或通过HTTP(SOAP)传输。服务通过服务定义来定义并指派给具体的服务引擎。每个服务引擎通过适当的方式负责调用服务定义。因为服务没有和web应用程序绑定在一起,就允许在没有响应对象可用时仍可以执行。这就允许在指定时间由工作调度程序在后台调用服务
    服务能够调用其他服务。因此,将多个小的服务串联起来实现一个大的任务使重用更容易。在不同应用程序中使用的服务可以通过创建全局服务定义文件(只能创建一个)或者一个应用程序的特定服务(这样的服务受限制且只能用于这个应用程序)。
    当在web应用程序中使用时,服务可以用于web事件,这允许同时在服务框架中并重用现成的逻辑。同样,服务可以定义成“exportable",允许外部程序访问。目前,SOAP EventHandler允许服务通过SOAP来产生。其他形式的远程访问将来会加入到框架中。
 
特点
1、不可知的服务调用:实现不可知,位置不可知,你需要调用的服务仅仅按照要求知道服务名和传递的参数即可,你不需要知道在哪里实现的,文件在哪个服务器上或者其他的这类事情。你也不必关心是用java、simplemethod、还是其他脚本语言实现的。这就提供了在调用服务代码和服务间的松耦合,提供了高伸缩性、增加重用性。
2、不同类型的服务调用:同步、异步、预定时间。相同的服务定义、相同的服务实现,可以根据应用的需要用不同的方式调用。
3、服务提供输入和输出参数的校验。
4、不同的实现方式:有许多不同方式实现服务,处理这些不同方式实现服务的对象称之为服务引擎。处理不同类型服务实现的每个对象都要实现GenericEngine interface。所以你想实现自己的服务,基本上实现这个接口即可。
 
服务引擎的定义
在serviceengine.xml文件中定义了存在的引擎
  <!-- Service Engine Configuration -->
<engine name="entity-auto" class="org.ofbiz.service.engine.EntityAutoEngine"/>
<engine name="group" class="org.ofbiz.service.group.ServiceGroupEngine"/>
<engine name="interface" class="org.ofbiz.service.engine.InterfaceEngine"/>
<engine name="java" class="org.ofbiz.service.engine.StandardJavaEngine"/>
<engine name="simple" class="org.ofbiz.minilang.SimpleServiceEngine"/>
<engine name="script" class="org.ofbiz.service.engine.ScriptEngine"/>
<!-- Engines that can be replaced by the generic script engine -->
<engine name="bsh" class="org.ofbiz.service.engine.BeanShellEngine"/>
<engine name="groovy" class="org.ofbiz.service.engine.GroovyEngine">
<parameter name="scriptBaseClass" value="org.ofbiz.service.engine.GroovyBaseScript"/>
</engine>
<engine name="jacl" class="org.ofbiz.service.engine.BSFEngine"/>
<engine name="javascript" class="org.ofbiz.service.engine.ScriptEngine"/>
<engine name="jpython" class="org.ofbiz.service.engine.BSFEngine"/>
<!-- -->
<engine name="route" class="org.ofbiz.service.engine.RouteEngine"/>
<engine name="http" class="org.ofbiz.service.engine.HttpEngine"/>
<engine name="jms" class="org.ofbiz.service.jms.JmsServiceEngine"/>
<engine name="rmi" class="org.ofbiz.service.rmi.RmiServiceEngine"/>
<engine name="soap" class="org.ofbiz.service.engine.SOAPClientEngine"/>
<engine name="ofbiz-workflow" class="org.ofbiz.workflow.WorkflowEngine"/>
<engine name="workflow" class="org.ofbiz.shark.service.SharkServiceEngine"/>
属性名
是否必须
描述
name
Y
服务引擎的名字,必须唯一
class
Y
GenericEngine接口的实现类
服务引擎的一些配置
服务引擎的名称:<service-engine name = "default"/>
authorization 标签设置服务授权需要调用的服务。这个标签只有一个属性service-name:属性值应该是用来授权的服务名。默认使用通用的OFBiz的UserLogin服务
        <!-- Name of the service to use for authorization -->
<authorization service-name="userLogin"/>
服务位置:
<service-location name="main-rmi" location="rmi://localhost:1099/RMIDispatcher"/>
<service-location name="main-http" location="http://localhost:8080/webtools/control/httpService"/> <service-location name="entity-sync-rmi" location="rmi://localhost:1099/RMIDispatcher"/>
<service-location name="entity-sync-http" location="http://localhost:8080/webtools/control/httpService"/> <service-location name="rita-rmi" location="rmi://localhost:1099/RMIDispatcher"/>
<service-location name="eedcc-test" location="http://localhost:8080/webtools/control/httpService"/>
服务引擎的线程池的配置
工作调度器(job scheduler)异步调用工作/服务。它包含池化的线程和几个请求线程。
thread-pool:该标签用来配置每个线程是怎操作。

 <!-- Thread pool configuration (max/min threads, uses to live and time to live) -->
<thread-pool send-to-pool="pool"
purge-job-days="4"
failed-retry-min="3"
ttl="18000000"
wait-millis="750"
jobs="10"
min-threads="5"
max-threads="15"
poll-enabled="true"
poll-db-millis="20000">
<run-from-pool name="pool"/>
</thread-pool>
如下属性可用
属性名
是否必须
描述
Ttl
Y
每个请求线程的存活时间。达到时间线程将被销毁
wait-millis
Y
每个请求线程在检查通过运行前休眠的时间
jobs
Y
每个请求线程在销毁之前可运行的工作数
min-threads
Y
线程池中保持的请求线程的最小数
max-threads
Y
线程池中将会创建请求线程的最大数
poll-enabled Y 为‘true’scheduler就会poll数据库来调度工作
poll-db-millis Y 如果线程池可用,本属性用来定义池化线程运行的频率
几种服务引擎
BeanShell(BSH):是用BeanShell脚本实现一个服务
服务组:你能用一组服务实现一个服务,结果是通过定义的服务组来调用其他服务
HTTP:http方式是通过另一台通过http通讯接口运行的服务引擎的一个服务,它是通过http或https运行的。指定URL联系到另一台服务器,发送请求到远程服务器,远程服务器通过处理后返回响应。
接口:这个是特殊的服务,其根本没有实现服务,只是设定了一个接口,它有属性定义。只是它的作用在于给其他服务继承和扩展
jacl:另一种脚本语言,基本上是java语言写的解释器。
java引擎:用java实现的静态方法(可能在OFBiz中使用较多的方式是这种)
RMI:远程调用接口,基于java的rmi方式调用
SOAP:另一个远程调用接口。将基于服务定义的自动化映射调用在另一台服务器的soap服务上
simple:用minilang实现的服务
 
服务的定义
服务定义在服务定义文件中,该文件一般在每个组件的servicedef目录下,习惯命名weiservices.xml
服务定义有一个唯一的名字,明确的服务引擎,明确的输入输出参数
参考:framework\common\servicedef\services.xml
    <service name="createNote" engine="java"
location="org.ofbiz.common.CommonServices" invoke="createNote">
<description>Create a new note record</description>
<attribute name="partyId" type="String" mode="INOUT" optional="true"/>
<attribute name="noteName" type="String" mode="IN" optional="true"/>
<attribute name="note" type="String" mode="IN" allow-html="safe"/>
<attribute name="noteId" type="String" mode="OUT"/>
</service>
服务元素
service的属性 详细参考framework/service/dtd/service.xsd
属性
是否必须
说明
缺省值
name
Y
服务的唯一名称
 
engine
Y
引擎的名称(在serviceengine.xml中定义)
 
location
N
位置或服务包类的包名
 
invoke
N
服务的方法名
 
auth
N
服务是否要求授权?(true/false)
true
debug N 当调用服务时,是否启动详细调试?(true/false) true
default-entity-name N 使用自动属性(auto-attribute)的缺省实体  
export N 这个服务是否允许通过SOAP/HTTP/JMS访问?(true/false) false
validate N 是否对服务参数的名字和类型进行验证?(true/false) true
max-retry N 异步调用服务失败时,最大重复次数 -1(无限次)
use-transaction N 是否使用事务 true
require-new-transaction N 在使用事务的情况下是否启动新事务 true
semaphore N 并发调用服务时使用的信号量:
none:当多个线程调用服务时,并发执行服务
wait:当多个线程调用服务时,采用排队的方法调用服务
fail:当服务正在被执行时,其他任何试图要调用该服务的线程都将调用失败
none
semaphore-wait-seconds N 当sempaphore="wait"时,调用服务的线程要等待的超时时间,
超时调用失败
300
semaphore-sleep N 当sempaphore="wait"时,1毫秒内做几次检查
(检查服务能否被调用)
300
transaction-timeout N 该服务的事务超时时间,当该服务启动新事务才有效 0
 
属性
attribute的属性 详细参考framework/service/dtd/service.xsd
属性
是否必须
描述
缺省值
name
Y
这个是属性的名字
 
type
Y
对象的类型(String,java.util.Date)等
 
model
Y
这个参数是输入、输出或输入输出(IN/OUT/INOUT)
 
optional
N
这个参数是否可选?(true/false)
false
default-value
N
默认值
 
form-label N 对应的表单项显示名称  
entity-name N 对象名  
field-name N 属性名  
string-map-prefix N Map类型参数的前缀  
string-list-prefix N List类型参数的后缀  
form-display N 是否在表单中显示?(true/false) true

我们参考几个service的定义看看service

参考一:framework\service\servicedef\services.xm
    <!-- simple condition implementation -->
<service name="effectiveDateEcaCondition" engine="java" auth="false" use-transaction="false"
location="org.ofbiz.service.ServiceUtil" invoke="genericDateCondition">
<implements service="serviceEcaConditionInterface"/>
<attribute name="fromDate" mode="IN" type="java.sql.Timestamp" optional="true"/>
<attribute name="thruDate" mode="IN" type="java.sql.Timestamp" optional="true"/>
</service>

参考二:applications/accounting/servicedef/services_finaccount.xml

    <service name="refundGcPurchase" engine="java" require-new-transaction="true" use-transaction="true"
location="org.ofbiz.accounting.payment.GiftCertificateServices" invoke="refundGcPurchase" auth="true">
<description>Creates return for reload on failure</description>
<attribute name="orderItem" type="org.ofbiz.entity.GenericValue" mode="IN" optional="false"/>
<attribute name="partyId" type="String" mode="IN" optional="false"/>
</service>

参考三:framework\service\servicedef\services.xml

    <!-- Service Engine Services -->
<service name="purgeOldJobs" engine="java"
location="org.ofbiz.service.ServiceUtil" invoke="purgeOldJobs" auth="true" use-transaction="false" semaphore="wait">
<description>Cleans out old jobs which have been around longer then what is defined in serviceengine.xml</description>
<required-permissions join-type="AND">
<check-permission permission="SERVICE_INVOKE_ANY"/>
</required-permissions>
<!-- this service has no attributes -->
</service>

Apache OFBiz 学习笔记 之 服务引擎 一的更多相关文章

  1. Apache OFBiz 学习笔记 之 服务引擎 二

    加载服务定义文件   ofbiz-component.xml:所有的服务定义文件在每个组件的ofbi-component.xml文件中   加载服务定义 例:framework/common/ofbi ...

  2. Apache OFBiz 学习笔记 之 实体引擎

    1.概述     entity engine和常见的ORM有一点很大的不同,他的mapping object只有一个 GenericEntity,称它的entity engine 为adaptive ...

  3. Apache Flink学习笔记

    Apache Flink学习笔记 简介 大数据的计算引擎分为4代 第一代:Hadoop承载的MapReduce.它将计算分为两个阶段,分别为Map和Reduce.对于上层应用来说,就要想办法去拆分算法 ...

  4. SpringCloud学习笔记:服务支撑组件

    SpringCloud学习笔记:服务支撑组件 服务支撑组件 在微服务的演进过程中,为了最大化利用微服务的优势,保障系统的高可用性,需要通过一些服务支撑组件来协助服务间有效的协作.各个服务支撑组件的原理 ...

  5. Apache Ignite 学习笔记(一): Ignite介绍、部署安装和REST/SQL客户端使用

    Apache Ignite 介绍 Ignite是什么呢?先引用一段官网关于Ignite的描述: Ignite is memory-centric distributed database, cachi ...

  6. Dubbo -- 系统学习 笔记 -- 示例 -- 服务分组

    Dubbo -- 系统学习 笔记 -- 目录 示例 想完整的运行起来,请参见:快速启动,这里只列出各种场景的配置方式 服务分组 当一个接口有多种实现时,可以用group区分. <dubbo:se ...

  7. 树莓派学习笔记——Restful服务 采用slim php apache

    0.前言     前些时间沉迷于Restful,采用PHP+Slim+MySQL实现了一些简单的API函数.但是这些工作都是在windows中实现(采用wamp server集成安装包),但是转到li ...

  8. Apache Lucene学习笔记

    Hadoop概述 Apache lucene: 全球第一个开源的全文检索引擎工具包 完整的查询引擎和搜索引擎 部分文本分析引擎 开发人员在此基础建立完整的全文检索引擎 以下为转载:http://www ...

  9. Apache Hadoop学习笔记一

    官网:http://hadoop.apache.org/ 1 什么是Hadoop? Apache™Hadoop®项目开发了用于可靠,可扩展的分布式计算的开源软件. Apache Hadoop软件库是一 ...

随机推荐

  1. 2013 ACM-ICPC长沙赛区全国邀请赛—Special equations

    ……但是没仔细看,直接跳过了 这题直接枚举就可以过了 ;}

  2. IOS时间格式转换

    在开发iOS程序时,有时候需要将时间格式调整成自己希望的格式,这个时候我们可以用NSDateFormatter类来处理. 例如:如何将格式为“12-May-14 05.08.02.000000 PM” ...

  3. 小米2S 连接Ubuntu Android Studio

    1. 首先打开手机上的开发者选项,USB调试.拨号:*#*#717717#*#*  ,手机会以Toast形式出现“……enable”字样.再次拨号可disable. 2. Ubuntu安装mtpfs: ...

  4. lintcode 中等题:unique Binary Search Tree 不同的二叉查找树

    题目 不同的二叉查找树 给出 n,问由 1...n 为节点组成的不同的二叉查找树有多少种? 样例 给出n = 3,有5种不同形态的二叉查找树: 1 3 3 2 1 \ / / / \ \ 3 2 1 ...

  5. css元素z-index设置为什么不起作用?

    元素位置重叠的背景常识 (x)html文档中的元素默认处于普通流(normal flow)中,也就是说其顺序由元素在文档中的先后位置决定,此时一般不会产生重叠(但指定负边距可能产生重叠). 当我们用c ...

  6. React组件测试(模拟组件、函数和事件)

    一.模拟组件 1.用到的工具 (1)browerify (2)jasmine-react-helpers (3)rewireify(依赖注入) (4)命令:browserify - t reactif ...

  7. Executing Raw SQL Queries using Entity Framework

    原文 Executing Raw SQL Queries using Entity Framework While working with Entity Framework developers m ...

  8. sql 随笔 2015-07-02

    sql 自定义函数 --检查函数是否存在 if exists (select * from dbo.sysobjects where id = object_id(N'dbo.pTitleCase') ...

  9. NDK xxxxx could not be resolved解决方法

    Type '*****' could not be resolved Method '******' could not be resolved     问题解决   以下为未尝试方法,如果上面方法解 ...

  10. hive环境的搭建

    hive 默认用的是derby数据库存储源数据,在这改为 mysql来存储: 1.hive和关系数据库的对照关系 hive 所要查询的数据保存在HDFS中: hive 中的数据库和表对应HDFS中的文 ...