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代表次数

OFBIZ-定时任务配置详解

 

 

 

相关文章: