使用ofbiz如何创建一个定时服务

如果想在java程序中添加一条jobSandbox调度的话可以用
     dispatcher.schedule(
               jobName,poolName, serviceName, serviceContext, 
               startTime,frequency, interval, count, endTime, maxRetry
          );

 

参数列表
jobName           :计划任务名称, 唯一标识
poolName           job池名称如果你不清楚这个是干嘛的话默认pool好了
serviceName      job 要调用的服务名称
serviceContext  map型参数job调度需要用到的数据,会被转化成XML格式保存到runtimeData(具体是在runtimeInfo字段) (重复调度的时候会再次用到)
startTime           long 格式执行调度的开始时间
frequency          :执行频率 (数据类型有  RecurrenceRule.DAILY(执行频率以天为单位)  
                                        RecurrenceRule.HOURLY(执行频率以小时为单位)等等)
interval              :执行间隔配合frequency使用 frequency 为单位interval 为数量
                                        联合起来其 XX/次(XX天执行一次)XX小时/次(XX小时执行一次) 
count                 :执行次数最大执行次数,当执行次数达到这个值时就不在执行了如果设置-1即不限次数
endTime           :执行结束时间,一般用在count -1 的时候使用,当限时时间达到这一时间时即不在执行
maxRetry          :失败后重复执行次数某次调度执行失败的话,重复执行的次数 -1 无限知到执行成功为止 

 

使用示例:自动完成订单定时服务 

如果是类似每月一日创建考核这种定时服务则可以直接在种子文件里配置定时服务,我们的案例需要灵活的参数所以将他创建在具体的Java方法里

         //StringserviceName, Map context, long startTime, int frequency频率, int interval间隔, int count次数                        dispatcher.schedule("autoOrderService",context,startDate,RecurrenceRule.MIN_MTH,1,3);

dispatcher.schedule()是一个重载方法,传参不一定全部按照上面列表参数的来传入

dispatcher.schedule放置于要让他执行的条件下,:改变订单项状态时检查订单项全部为"已完成状态此时设置定时服务所需的参数,创建定时服务来完成订单(参数的意义参考上述参数列表描述)

 

在这个定时服务autoOrderService里做你要做的事,调方法还是调另一个服务由你自己来决定

时间到后定时服务会执行,该定时服务的status_id会改为"SERVICE_FINISHED",但此时这个定时服务并未死亡,他会根据你设置的频率在下一个周期继续执行.比如每月一号创建考核.但是对于订单自动完成这件事,完成后该定时服务就该死亡.记得取消掉定时服务,如果该订单手动完成了,也需要在手动完成的程序里取消这个定时服务.一定要确保该定时服务在你不再需要它的时候将它取消,看下面程序.

  public static Map<String,Object>autoOrderService(DispatchContext dctx, Map<String, Object> context){

             LocalDispatcherdispatcher = dctx.getDispatcher();

             Map<String,Object> result = ServiceUtil.returnSuccess();

             Delegatordelegator = dctx.getDelegator();

             GenericValueuserLogin = (GenericValue) context.get("userLogin");

             @SuppressWarnings("unused")

                   String orderId=(String)context.get("orderId");

        Map<String, Object> newSttsResult= null;

        try {

                 //改变状态

                 //System.out.println("调度服务正在运行中!!祝贺你"+System.currentTimeMillis());

            newSttsResult =dispatcher.runSync("changeOrderStatus", context);

            //System.out.println("调度服务改变状态结束"+System.currentTimeMillis());

                 //首先去runtimeData表里面查询到对应的那条数据

                 //EntityCondition.makeCondition("geoTypeId",EntityOperator.EQUALS, "STATE"),

                 GenericValuejobSandbox = checkJob(delegator, context);

            if(ServiceUtil.isSuccess(newSttsResult)) {

                     if(UtilValidate.isNotEmpty(jobSandbox)) {

                               //拿到这条数据后去,查到关联的那条任务,然后立即取消它

                               Map<String,Object> inMap = FastMap.newInstance();

                               if(UtilValidate.isNotEmpty(userLogin)){

                                        inMap.put("userLogin",userLogin);

                               }

                               inMap.put("jobId",jobSandbox.getString("jobId"));

//调用完服务以后,记得取消这个job .jobstatus_id状态改为"SERVICE_CANCELLED",这时它才会停止

                               dispatcher.runSync("cancelScheduledJob",inMap);

//                           System.out.println("已取消");

                     }

                            }

        }catch (GenericServiceException e) {

            Debug.logError(e, "Problemcalling the changeOrderStatus service", module);

        }

        if (ServiceUtil.isError(newSttsResult)){

            returnServiceUtil.returnError(ServiceUtil.getErrorMessage(newSttsResult));

        }

             returnresult;

    }


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值