咨询1
咨询2
交流群
电话

10-二次开发教程-定时任务开发-v8

文档 > 二次开发 2018-03-26 14:42 阅读

系统中有定时任务功能,里面有一些系统已经定义好的任务类型。如果系统自带的任务类型里没有自己需要的,可以开发一个任务类型。

本着无侵入的二次开发设计思想,开发一个自己的任务类型也可以做到不修改系统原有代码和文件。

定时任务配置文件

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

录入界面的Controller

编写一个获取录入界面的地址:/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");传递录入界面。

录入界面的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.jspxcms.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}对应CollectControllermodelMap.addAttribute("collectList", collectList);