1、定义一个定时操作XX的Service,比方说定时更新某订单的状态
<service name="timeModifyOrderStatus" engine="java"
location="org.apache.ofbiz.order.order.OrderServices" invoke="timeModifyOrderStatus" auth="true">
<description>定期更新订单状态</description>
</service>
2、在framework/service/data/ScheduledServices.xml中配置定时任务:
<entity-engine-xml>
<TemporalExpression tempExprId="TIME_MODIFY_ORDER_STATUS" tempExprTypeId="MINUTE_RANGE" description="Every minutes" integer1="0" integer2="59"/>
<JobSandbox jobId="TIME_MODIFY_ORDER_STATUS_JOBS" jobName="CHANGE ORDER STATUS" runTime="2019-10-10 00:00:00.000" serviceName="timeModifyOrderStatus" poolId="pool-idea" runAsUser="system" tempExprId="TIME_MODIFY_ORDER_STATUS" maxRecurrenceCount="-1"/>
</entity-engine-xml>
3、配置文件相关
--- JobSendBox标签里面的属性serviceName指的是被调用service的名称
--- 属性maxRecurrenceCount, 值为0,表示不重复,值为-1,表示无限次重复,值为大于0的数,则重复次数为这个数值。
--- 如果部署了2个OFBiz实例的话,就会出现冲突,每个实例都认为那些job是需要自己执行的,所以需要修改一些配置文件来达到这样的目的。
- serviceengine.xml
这个文件正在framework/service/config/serviceengine.xml,找到以下代码
<thread-pool send-to-pool="pool-idea"
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-idea"/>
</thread-pool>
将send-to-pool="pool"这里的pool改成其他名字,比如pool1、pool2,将run-from-pool name="pool"改成和上面一样的
- general.properties
这个文件在/framework/common/config/general.properties,将unique.instanceId=ofbiz1的值改成不一样的,比如2个实例分别叫做ofbiz1、ofbiz2
在上面的配置文件配置好以后,在配置定时任务的时候,pool这个输入框填写你想让哪个ofbiz实例去运行这个服务,如A服务让pool1运行,B服务让pool2运行
在serviceengine配置中,pool可以简单的理解为服务运行池,每个实例在任务调度的时候,run-from-pool这个属性的值会被读出来,所以每个实例只会去跑自己的服务,所以不会有冲突。
--- tempExprTypeId
详细用法如下图:
比如 FREQUENCY: 表示频率,integer1="5" , integer2="1",表示每天一次,integer1的时间代码为:Second = 13, Minute = 12, Hour = 11, Day = 5, Month = 2, Year = 1 ,integer2代表次数