系统中有定时任务功能,里面有一些系统已经定义好的任务类型。如果系统自带的任务类型里没有自己需要的,可以开发一个任务类型。
本着无侵入的二次开发设计思想,开发一个自己的任务类型也可以做到不修改系统原有代码和文件。
Jspxcms8.0及以后版本:
/src/main/resources/conf/conf.properties
Jspxcms6.5-7.5版本:
/src/main/resources/conf/application.properties
Jspxcms6.0及以前的版本:
/WEB-INF/conf/application.properties
相关配置内容:
scheduleJob.100=com.jspxcms.core.quartz.InfoPublishJob
scheduleJobPath.com.jspxcms.core.quartz.InfoPublishJob=
scheduleJob.200=com.jspxcms.core.quartz.HtmlHomeJob
scheduleJobPath.com.jspxcms.core.quartz.HtmlHomeJob=
scheduleJob.300=com.jspxcms.ext.quartz.CollectJob
scheduleJobPath.com.jspxcms.ext.quartz.CollectJob=/cmscp/ext/collect/schedule_job.do
自定义的定时任务类型的配置也可以写在其它的conf.properties
文件中,如/src/main/resources/conf/plugin/plug/conf.properties
。
scheduleJob.300
:序号300
决定这个类型的排序,即在选择任务类型时的前后顺序。序号不能重复。
com.jspxcms.ext.quartz.CollectJob
既是定时任务实现类,又是定时任务类型名称。需要在国际化文件中定义相应的国际化名称。
国际化文件(Jspxcms6.5及以后版本):/src/main/resources/messages/ext/ext.properties
国际化文件(Jspxcms6.0及以前的版本):/WEB-INF/messages/ext/ext.properties
scheduleJob.code.com.jspxcms.ext.quartz.CollectJob=采集
需以scheduleJob.code.
开头。国际化名称也可以写在其他文件中,如/src/main/resources/messages/plugin/plug/plug.properties
。
com.jspxcms.ext.quartz.CollectJob
是定时任务实现类。
public class CollectJob implements Job {
private static final Logger logger = LoggerFactory
.getLogger(CollectJob.class);
public static final String COLLECT_ID = "collectId";
public void execute(JobExecutionContext context)
throws JobExecutionException {
try {
ApplicationContext appContext = (ApplicationContext) context
.getScheduler().getContext().get(Constants.APP_CONTEXT);
Collector collector = appContext.getBean(Collector.class);
JobDataMap map = context.getJobDetail().getJobDataMap();
Integer collectId = map.getIntegerFromString(COLLECT_ID);
collector.start(collectId);
System.out.println("collect ok");
logger.info("run collect job: " + collectId);
} catch (SchedulerException e) {
throw new JobExecutionException("Cannot get ApplicationContext", e);
}
}
}
需要实现org.quartz.Job
接口,在public void execute(JobExecutionContext context)
方法中编写任务需要执行的代码。
ApplicationContext appContext = (ApplicationContext) context.getScheduler().getContext().get(Constants.APP_CONTEXT);
可以获取Spring的ApplicationContext,通过ApplicationContext可以获取到Spring管理的对象,如Collector collector = appContext.getBean(Collector.class);
。注意:这个类中必须使用这种方法获取Spring管理的对象,不能使用@Autowired
等其他方式。
Integer collectId = map.getIntegerFromString(COLLECT_ID);
可以获取额外的参数。
scheduleJobPath.com.jspxcms.core.quartz.InfoPublishJob=
如定时任务无需额外参数,则等号后面留空。
定时任务有时需要传递外的参数,比如采集定时任务需要选择执行哪个采集数据源。此时需要在定时任务新增/修改界面增加相应的录入项。
scheduleJobPath.com.jspxcms.ext.quartz.CollectJob=/cmscp/ext/collect/schedule_job.do
编写一个获取录入界面的地址:/cmscp/ext/collect/schedule_job.do
,这里使用相对路径,相对于定时任务新增界面的地址。
此例中,这个地址的实现类是com.jspxcms.ext.web.back.CollectController
。
@Controller
@RequestMapping("/ext/collect")
public class CollectController {
...
@RequestMapping("schedule_job.do")
public String scheduleJob(HttpServletRequest request, org.springframework.ui.Model modelMap) {
Integer siteId = Context.getCurrentSiteId();
List<Collect> collectList = service.findList(siteId);
modelMap.addAttribute("collectList", collectList);
modelMap.addAttribute("includePage", "../../ext/collect/collect_job.jsp");
return "core/schedule_job/schedule_job_form";
}
...
}
modelMap.addAttribute("collectList", collectList);
传递数据。modelMap.addAttribute("includePage", "../../ext/collect/collect_job.jsp");
传递录入界面。根据Controller中传递的includePage
的值,对应JSP页面为:/WEB-INF/views/ext/collect/collect_job.jsp
。
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="s" uri="http://www.springframework.org/tags"%>
<%@ taglib prefix="f" uri="http://www.ujcms.com/tags/form"%>
<tr>
<td class="in-lab" width="15%"><s:message code="scheduleJob.collectSource"/>:</td>
<td class="in-ctt" width="85%" colspan="3">
<select name="data_collectId">
<c:forEach var="collect" items="${collectList}">
<f:option value="${collect.id}" selected="${dataMap['collectId']}">${collect.name}</f:option>
</c:forEach>
</select>
</td>
</tr>
<select name="data_collectId">
:此处的data_collectId
对应定时任务实现类CollectJob
中获取参数的方法Integer collectId = map.getIntegerFromString("collectId");
<c:forEach var="collect" items="${collectList}">
:此处的${collectList}
对应CollectController
的modelMap.addAttribute("collectList", collectList);
。