ofbiz 的service eca 调用模式
1. 定义文件位置
首先我们需要明白eca是什么?
在执行service 的过程中,可以把调用service 的过程分为几个步骤完成。
开启事务
用户登陆验证(auth)
依照service定义对输入参数验证(in-validate)
执行service invoke(invoke)
依照service定义对执行结果进行输出验证(out-validate)
提交事务(commit)
返回最终结果(return)
在执行这每个步骤之前,我们定义一个设置来运行其他一些service,这类设置就是service eca .
service eca与service.xml 存放位置平级,都存放在对应模块的/servicedef/底下。
2. eca定义
2.1. 例子
<eca service="TestServiceOnSimple" event="return">
<action service="TestServiceOnJava" mode="sync"
result-to-context="true" result-to-result="true"
result-map-name="TestServiceOnJavaEcaName"/>
</eca>
如上例就是一个简单的service eca 调用.含义为,当系统调用TestServiceOnSimple这个service 执行到将要返回结果之前调用
TestServiceOnJava这个service
如果有设置result-map-name的值,那么系统会将service
TestServiceOnJava的结果以result-map-name的值为key放进的service
TestServiceOnSimple的输入参数并覆盖原来。
(即:context(TestServiceOnSimple).put(${result-map-name },
result(TestServiceOnJava));)
,并将service TestServiceOnJava的执行结果赋到service TestServiceOnSimple
的输入参数以及service TestServiceOnSimple 的输出结果(需要将service
TestServiceOnJava的输出结果依据service TestServiceOnSimple的输出定义进行过滤)。
2.2. Eca
: service:触发eca调用的service 名称。
:event:触发eca调用的event 关键字,即service 调用执行的那几个步骤。这里调用eca 一那几个步骤之前,如event 的 值为commit ,那么则会在commit 之前调用eca.
2.3. Condition、Condition-service、condition-field
这几个都是对是否调用eca service 进行条件判断的命令。条件满足则调用eca,不满足则直接退出。
Condition : 参数变量与固定值进行比较。
<condition operator="equals" field-name="workEffortId" map-name="ParaMap" value="12345"/>
详细请参考minilang 解析的 condition-expr,差不多。map-name如果有 设置 的话参数变量为ParaMap.workEffortId 。
condition-field :参数变量与参数变量进行比较。
to-field-name 被比较参数变量名称,to-map-name 如果不为null ,则被 比较参数变量为${to-map-name}.${to-field-name}
Condition-service
通过调用service 进行判断,如果返回结果状态码为error 则不满足条件,
其他情况条件满足. Java service 中返回结果状态码为error有两种情况
re.put("error", errorMsg);
return re;
或者
return ServiceUtil.returnError();
这三个condition 和 action 组合使用。
2.4. set
请参考 minilang 的set .
无论set 还是Condition、Condition-service、condition-field 所使用和操作的参数变量都是在eca 的输入参数context 中进行的。
那么eca 的输入参数context 从哪来 ?
假设A服务的eca action B服务被调用,B 的参数来源会根据event 的类型决定其来源,如event为"commit
"、"out-validate"、"global-commit-post-run"、"return",那么B的参数来源为A的context和A的
result ,而其他event类型则参数只来源于A服务的context。
2.5. Action
Eca 触发service 定义。
result-map-name、result-to-context、result-to-result
2.1例子中解释过了。
:mode="sync":同步执行。mode="async"则为异步执行。