OFBiz进阶--OFBiz开发之异步服务与计划任务[更新]
OFBiz进阶--OFBiz开发之
异步服务与计划任务(Job Scheduler)
如果想在java程序中添加一条jobSandbox调度的话可以用
dispatcher.schedule(
jobName, poolName, serviceName, serviceContext,
startTime, frequency, interval, count, endTime, maxRetry
);
webtools新建任务计划功能实际方法实现, 在如下位置:
org.ofbiz.webapp.event.CoreEvents.scheduleService
(HttpServletRequest request, HttpServletResponse response)
[dispatcher.schedule]方法的参数分析
jobName :计划任务名称, 唯一标识
poolName : job池名称 如果你不清楚这个是干嘛的话 默认pool好了
serviceName : job 要调用的服务名称
serviceContext :map型参数 ,job调度需要用到的数据 ,会被转化成XML格式保存到runtimeData中 (重复调度的时候会再次用到)
startTime :long 格式 执行调度的开始时间
frequency :执行频率 (数据类型有 RecurrenceRule.DAILY(执行频率以天为单位) 、
RecurrenceRule.HOURLY(执行频率以小时为单位)等等)
interval :执行间隔 配合frequency 使用 , frequency 为单位 , interval 为数量 ,
联合起来其 XX天/次(XX天执行一次) 、XX小时/次(XX小时执行一次)
count :执行次数 。 最大执行次数,当执行次数达到这个值时就不在执行了 。 如果设置-1 即不限次数
endTime :执行结束时间,一般用在count 为-1 的时候 使用 ,当限时时间达到这一时间时 即不在执行
maxRetry :失败后重复执行次数 , 某次调度执行失败的话 ,重复执行的次数 , -1 无限 , 知到执行成功为止
异步服务与计划任务的关系
异步服务在一个独立的线程中运行并且当前线程将不等待。
调用的服务将和调用它的服务或事件有效地开始并发运行。
当前服务的线程因此获取不到异步运行服务的信息。
异步服务中发生的错误将不会引发调用它的服务或者事件的失败或者错误。
异步服务实际上添加到Job Scheduler中。它是Job Scheduler的调用队列中等待调用的服务的任务。
Service Engine Tools(服务引擎工具)头的下面。选择Job List(任务列表)来看任务的全部列表。
没有Start Date/Time(起始日期和时间)的job还未开始。
那些有End Date/Time(结束日期/时间)的job已经完成。Run Time(运行时间)是他们被安排运行的时间。
初始化种子数据执行时,列表中所有突出的任务都被添加到JobSandbox实体中,
和指定它们多长时间执行一次的RecurrenceRule(也是一个实体)信息一起。
任务运行的Pool默认设置是pool。一个OFBiz实例可以专用来执行特定任务,
即便如此任务调度程序可能在每个实例中运行,即只有一个实例将运行该任务。
调度器执行计划任务的原理[更新2014-03-25 21:12:31]
调度程序的最佳用法的例子是一个异步服务调用。
当调用异步服务,它被传递给任务调度队列。依次创建(创建RecurrenceInfo和RecurrenceRule实体)
存储计划任务(创建JobSandbox实体)和上下文(Map)被序列化并存储(建立RuntimeData实体)
调度器找到计划任务队列的顶部任务(异步服务没有任何延迟时间)按队列执行。
使用示例
//jobSandbox 功能解析
String jobName = "job1"; //计划名
String poolName = "pool"; //默认方式
String serviceName = "serviceName"; //计划执行的服务名称
Map<String, Object> service_context = FastMap.newInstance(); //服务需要的初始数据
long startTime = System.currentTimeMillis(); //开始时间
long endTime = System.currentTimeMillis(); //结束时间
int frequency = 1; //频率
int interval = 1000; //间隔
int count = 1; //次数
int maxRetry = 3; //最大重试次数
try {
dispatcher.schedule(jobName, poolName, serviceName, service_context,
startTime, frequency, interval, count, endTime, maxRetry);
} catch (GenericServiceException e) {
Debug.logError(e, e.getMessage(), module);
}
==================================关于本文===================================
作者: mf1389004071
...上海_香飘飘
博客: http://ofbizer.iteye.com/
邮箱: mf1389004071@163.com
有此标记, 均为原创, 禁止盗用, 转载请注明来源
技术无上限, 能力有上限, 欢迎参与交流讨论和提出建议
本文永久地址: http://ofbizer.iteye.com/blog/2031403