ofbiz总结——OFBiz中有两种类型的ECA规则:SECAs和EECAs

来源:互联网 发布:c语言scanf什么意思 编辑:程序博客网 时间:2024/05/21 17:17

OFBiz中有两种类型的ECA规则:Service Event Condition Actions(SECAs)和Entity Event Condition Actions(EECAs)。

SECA

对于SECA,触发器(事件)是一个将调用的服务。一个条件可能是如果一个参数等于某个值(条件是可选的),动作是调用另一个服务。
SECA定义在与服务定义相同的目录中(servicedef)。在名为secas.xml文件中。
研究一下applications\order\servicedef\secas.xml中既存的SECA,我们可以看到一个简单的ECA:
---------------------------------------------------
<eca service="changeOrderStatus" event="commit" run-on-error="false">
    <condition field-name="statusId" operator="equals" value="ORDER_CANCELLED"/>
    <action service="releaseOrderPayments" mode="sync"/>
</eca>
---------------------------------------------------
当changeOrderStatus事务将要提交时,框架执行一个检查来看事件是否有任何ECA。如果有,并且参数statusId是 ORDER_CANCELLED,然后releaseOrderPayments服务同步运行。


更普遍的,SECA在commit或return上触发;然而,在服务生命周期中的下面任何阶段事件都是可能的:
·   auth——认证之前
·   in-validate——IN参数检查之前
·   out-validate——OUT参数检查之前
·   invoke——服务调用之前
·   commit——事务提交之前
·   return——服务返回之前
·   global-commit
·   global-rollback


变量 global-commit和 global-rollback有一点不同。如果服务是一个事务的一部分,它们仅在回滚后或者提交的两个阶段(JTA实现)间运行。
也有两个值默认为false的特殊属性:
·   run-on-failure
·   run-on-error


如果你想在尽管失败或者错误时SECA运行,可以设置为true。失败与错误是相同的事物,除了它不代表需要回滚的情况。
需要注意的是,如果需要,传递到触发服务的参数对动作服务是有效的。触发服务OUT参数对动作服务也是有效的。
在组件使用SECA之前,组件必须知道ECA服务资源的位置:
<service-resource type="eca" loader="main" location="servicedef/secas.xml"/>
在组件的 ofbiz-component.xml文件中存在的 <service-resource>元素下面必须添加这一行。


EECA

对于EECA,事件是在一个实体上的一个操作,动作是将要调用的服务。
EECA定义在与实体定义(entitydef)相同的目录中:在名为eecas.xml的文件中。
当它们可能不必要是初始化实体上的一个操作的一个服务时使用它们,或者你可能希望操作该实体上的服务的什么参数都是没有关系的。
打开applications\product\entitydef目录的eecas.xml文件并查看第一个<eca>元素:
---------------------------------------------------
<eca entity="Product" operation="create-store" event="return">
    <condition field-name="autoCreateKeywords" operator="not-equals" value="N"/>
    <action service="indexProductKeywords" mode="sync" value-attr="productInstance"/>
</eca>
---------------------------------------------------
该ECA确保一旦Product记录上的任何创建或更新操作碑提交,只要该字段的autoCreateKeywords字段不是N,indexProductKeywords服务将自动同步调用。
操作可以是下面任何自我说明的操作:
·   create
·   store
·   remove
·   find
·   create-store (create or store/update)
·   create-remove
·   store-remove
·   create-store-remove
·   any


return事件是至此EECA使用最多的事件。但也存在 validate, run, cache-check,cache-put 和 cache-clear事件。也有run-on-error属性。
在组件中使用EECA之前,组件必须知道eca 实体资源的位置:
<entity-resource type="eca" loader="main" location="entitydef/eecas.xml"/>
必须在ofbiz-component.xml文件的既存<entity-resource>元素的下面添加这一行。
 
注意:ECA常常公开发现人们在说谎(catch people out)。因为在代码中触发器服务中没有显式的流程,它们可能很难调试。调试时常看看日志。当一个ECA触发了,日志中就会添加一条来通知这个触发和动作。