调用服务
通过ServiceFacade(ec.getService()或Groovy中的ec.service)的DSL风格的接口,有选项可应用到调用服务的各个方法。所有这些服务调用接口有name()方法来指定服务名字,和parameter()和parameters()方法来为服务指定入参。这些和多种接口上的其他方法返回一个自身的实例,这样可以链式调用。大部分接口有call()方法的某种变种来实际调用服务。
例如:
Map ahp = [visitId:ec.user.visitId, artifactType:artifactType, ...]
ec.service.async().name("create", "moqui.server.ArtifactHit").parameters(ahp).call()
Map result = ec.service.sync().name("org.moqui.impl.UserServices.create#UserAccount").parameters(params).call()
第一个服务调用是一个隐式定义的实体CRUD服务,用来异步创建一条ArtifactHit记录。注意async()和call()啥也不返回,并且在此例中服务调用的结果被忽略。第二个是一个同步调用,调用一个定义好的服务,有一个Map类型的输入参数params,并且因为它是一个sync() 调用,call()方法返回一个有服务调用结果的Map。
除了这些基础的方法外,调用服务的不同方式的每个接口都有设置适当选项的方法,包括:
- sync(): 同步调用服务并返回结果
- requireNewTransaction(boolean requireNewTransaction): 如果为true,暂停/恢复当前事务(如果有活跃事务)并为此服务调用范围开始一个新事务
- multi(boolean mlt): 如果为true,期望多个参数集在单个map中传入,每个数据集有一个下划线和在第几行的后缀。例如"userId_8"表示在第8行中的userId参数。
- disableAuthz(): 为当前线程在服务调用中禁止鉴权
- async(): 异步调用服务并忽略结果,拿回一个ServiceResultWaiter对象以等待结果,或者传入一个ServiceResultReceiver接口的实现以在服务完成时接收结果。
- callFuture(): 调用服务(像call())并返回一个 java.util.concurrent.Future 实例用于等待并接收服务结果。
- distribute(boolean dist): 如果为true,服务调用将被分布地运行,可能在集群的不同成员上运行。参数条目必需是 java.io.Serializable(或java.io.Externalizable)。如果为false,它将只在本地运行(默认)。
- special():注册当前服务为在当前事务要么被提交(用registerOnCommit())或回滚(用registerOnRollback())时被调用。此接口没有call()方法。
服务任务(Service Jobs)
使用 moqui.service.job.ServiceJob 和 moqui.service.job.ServiceJobParameter 实体来配置即时(明确地被执行)或计划任务。这是一个来自Moqui默认带有的MoquiInstallData.xml文件的计划任务的例子:
<moqui.service.job.ServiceJob jobName="clean_ArtifactData_daily" description="Clean Artifact Data: ArtifactHit, ArtifactHitBin" serviceName="org.moqui.impl.ServerServices.clean#ArtifactData" cronExpression="0 0 2 * * ?" paused="N"> <parameters parameterName="daysToKeep" parameterValue="90"/> </moqui.service.job.ServiceJob>
- 使用 moqui.service.job.ServiceJobRun 记录来跟踪任务的执行
通过 ServiceCallJob 接口(ec.service.job())来运行任务
run(): 运行一个服务任务
ec.service.job("ImportEntityDataSnapshot").parameters(context).run()