如果想在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 .该job的status_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;
}