spring3.0定时任务配制与使用
1、配置applicationContext-schedule.xml配置文件
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p" xmlns:task="http://www.springframework.org/schema/task" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.0.xsd "> <context:component-scan base-package="com.jyd.dzadmin.action.order" /> <task:annotation-driven/> <bean id="updateOrderDataTask" class="com.jyd.dzadmin.dao.order.UpdateOrderDataTask"/> </beans>
2、业务处理代码,如下所示:
package com.jyd.dzadmin.dao.order; import java.text.SimpleDateFormat; import java.util.Date; import java.util.List; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import com.jyd.dzadmin.base.LogMessage; import com.jyd.dzadmin.dataobject.entity.order.PxOrder; import com.jyd.dzadmin.dataobject.entity.trade.PxOfferHistoryVolume; import com.jyd.dzadmin.dataobject.entity.trade.PxTradeDay; import com.jyd.dzadmin.service.order.PxOrderManager; import com.jyd.dzadmin.service.trade.PxTradeDayManager; /**************************************************** * 定时更新PX_OFFER_HISTORY_VOLUME * @author huangli * @date 2016-07-15 * @version 2.0 * @desciption *****************************************************/ @Component public class UpdateOrderDataTask{ @SuppressWarnings("unused") private static final long serialVersionUID = 640950911848231784L; private static Logger logger = LoggerFactory.getLogger(UpdateOrderDataTask.class); private PxOfferHistoryVolume pxOfferHistoryVolume; private static PxTradeDayManager pxTradeDayManager; private static PxOrderManager pxOrderManager; private static UpdateOrderDataTask instance = null; SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");//设置日期格式 String nowTime = df.format(new Date()); //@Scheduled(fixedDelay=1000) //第一种方式 //fixedDelay延时多少毫秒,多少毫秒执行一次 //"0 59 23 * * ?" 每天晚上11点59分触发 //@Scheduled(cron="0 * * * * *") @Scheduled(cron="0 59 23 * * ?") public void updateOrderDataJob(){ boolean fg = false;//false:非交易时间 true:是交易时间 logger.info(String.format(LogMessage.METHOD_BEGIN ,"更新历史表订单数据")); List<PxTradeDay> tList = pxTradeDayManager.getAllStartTime(); //判断系统时间是否是交易日时间 for(PxTradeDay pd:tList){ String startTime = df.format(pd.getStartTime()); if(nowTime.equals(startTime)){ fg = true; logger.info(String.format(LogMessage.METHOD_BEGIN ,nowTime+"是交易日时间")); break; } } List<PxOrder> plist = pxOrderManager.getAllPxOrder(); //是:交易表中是交易时间的数据插入库 if(fg == true){ for(PxOrder p:plist){ String confirmTime = df.format(p.getConfirmTime()); if(confirmTime.equals(nowTime)){ PxOfferHistoryVolume px = new PxOfferHistoryVolume(); px.setCatCode(p.getCatCode()); px.setClassCode(p.getClassCode()); px.setBrandCode(p.getBrandCode()); px.setOrderCount(p.getOrderPlanCount()); px.setRealOrderCount(p.getOrderCount()); px.setCreateDate(new Date()); if(p.getUnitPrice() != 0){ px.setRealDealCount(p.getPayAmt()/p.getUnitPrice()); } px.setCreateDate(p.getConfirmTime()); pxOrderManager.addPxHisttory(px); } } } logger.info(String.format(LogMessage.METHOD_BEGIN ,"更新历史表订单数据成功")); } public PxOfferHistoryVolume getPxOfferHistoryVolume() { return pxOfferHistoryVolume; } public void setPxOfferHistoryVolume(PxOfferHistoryVolume pxOfferHistoryVolume) { this.pxOfferHistoryVolume = pxOfferHistoryVolume; } public PxTradeDayManager getPxTradeDayManager() { return pxTradeDayManager; } public void setPxTradeDayManager(PxTradeDayManager pxTradeDayManager) { this.pxTradeDayManager = pxTradeDayManager; } public PxOrderManager getPxOrderManager() { return pxOrderManager; } public void setPxOrderManager(PxOrderManager pxOrderManager) { this.pxOrderManager = pxOrderManager; } /** * 返回当前对象 * 单例模式 */ public static UpdateOrderDataTask getInstance( PxOrderManager pxOrderManager2, PxTradeDayManager pxTradeDayManager2) { if (instance == null) { instance = new UpdateOrderDataTask(); } pxOrderManager = pxOrderManager2; pxTradeDayManager = pxTradeDayManager2; return instance; } }
3、服务器启动,自动加载业务处理类,如下所示:
package com.jyd.dzadmin.base; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import org.springframework.web.context.WebApplicationContext; import org.springframework.web.context.support.WebApplicationContextUtils; import com.jyd.dzadmin.dao.order.UpdateOrderDataTask; import com.jyd.dzadmin.dataobject.entity.system.PxDictionarys; import com.jyd.dzadmin.service.enterprise.PxEnterpriseManager; import com.jyd.dzadmin.service.order.PxOrderManager; import com.jyd.dzadmin.service.system.PxDictionarysManager; import com.jyd.dzadmin.service.trade.PxCategoryManager; import com.jyd.dzadmin.service.trade.PxIndustryManager; import com.jyd.dzadmin.service.trade.PxPrdBrandManager; import com.jyd.dzadmin.service.trade.PxPrdClassManager; import com.jyd.dzadmin.service.trade.PxTradeDayManager; import com.jyd.dzadmin.service.trade.PxWarehouseManager; public class AutoLoad extends HttpServlet{ private static final long serialVersionUID = -7268912545762560424L; private PxDictionarysManager pxDictionarysManager; @Override public void init() throws ServletException { super.init(); //装载字典 WebApplicationContext ac = WebApplicationContextUtils.getWebApplicationContext(getServletContext()); pxDictionarysManager = (PxDictionarysManager) ac.getBean("pxDictionarysManager"); Map<String, Map<String,String>> dictMap = new HashMap<String, Map<String,String>>(); List<PxDictionarys> listmain =pxDictionarysManager.findAllDict(); if(listmain.size()>0){ String dictname = ""; Map<String, String> detailMap = new HashMap<String, String>() ; for(PxDictionarys dm : listmain){ if(!dictname.equals(dm.getDictname())){ if(!"".equals(dictname)){ dictMap.put(dictname, detailMap); } detailMap = new HashMap<String, String>(); dictname = dm.getDictname(); } detailMap.put(dm.getValue(), dm.getName()); } dictMap.put(dictname,detailMap); getServletContext().setAttribute("dict_map",dictMap); } //向缓存中放行业 PxIndustryManager pxIndustryManager = (PxIndustryManager) ac.getBean("pxIndustryManager"); pxIndustryManager.refresh(); //向缓存中存放品类 PxCategoryManager pxCategoryManager = (PxCategoryManager) ac.getBean("pxCategoryManager"); pxCategoryManager.refresh(); //向缓存中存放品牌 PxPrdBrandManager pxPrdBrandManager = (PxPrdBrandManager) ac.getBean("pxPrdBrandManager"); pxPrdBrandManager.refresh(); //向缓存中存放品种 PxPrdClassManager pxPrdClassManager = (PxPrdClassManager) ac.getBean("pxPrdClassManager"); pxPrdClassManager.refresh(); //向缓存中存放交割库 PxWarehouseManager pxWarehouseManager = (PxWarehouseManager) ac.getBean("pxWarehouseManager"); pxWarehouseManager.refresh(); //向缓存中存放企业 PxEnterpriseManager pxEnterpriseManager = (PxEnterpriseManager) ac.getBean("pxEnterpriseManager"); pxEnterpriseManager.refresh(); //郭文文 部署工作流 /*PxProcessManager pxProcessManager = (PxProcessManager)ac.getBean("pxProcessManager"); pxProcessManager.deploy();*/ //薛昌贵 启动订单过期定时器 2016-01-12 /*PxOrderManager pxOrderManager = (PxOrderManager) ac.getBean("pxOrderManager"); PxTradeDayManager pxTradeDayManager = (PxTradeDayManager) ac.getBean("pxTradeDayManager"); OrderExpireTimer oet = OrderExpireTimer.getInstance(pxOrderManager ,pxTradeDayManager); PxVisitManager pxVisitManager = (PxVisitManager) ac.getBean("pxVisitManager"); VisitUtil urmc = VisitUtil.getInstance(pxVisitManager);*/ // PxOrderManager pxOrderManager = (PxOrderManager) ac.getBean("pxOrderManager"); // PxTradeDayManager pxTradeDayManager = (PxTradeDayManager) ac.getBean("pxTradeDayManager"); // OrderExpireTimer oet = OrderExpireTimer.getInstance(pxOrderManager ,pxTradeDayManager); // // PxVisitManager pxVisitManager = (PxVisitManager) ac.getBean("pxVisitManager"); // VisitUtil urmc = VisitUtil.getInstance(pxVisitManager); PxOrderManager pxOrderManager = (PxOrderManager) ac.getBean("pxOrderManager"); PxTradeDayManager pxTradeDayManager = (PxTradeDayManager) ac.getBean("pxTradeDayManager"); //UpdateOrderDataTask updateOrderDataTask = (UpdateOrderDataTask) ac.getBean("updateOrderDataTask"); UpdateOrderDataTask oet = UpdateOrderDataTask.getInstance(pxOrderManager ,pxTradeDayManager); oet.updateOrderDataJob(); } public PxDictionarysManager getPxDictionarysManager() { return pxDictionarysManager; } public void setPxDictionarysManager(PxDictionarysManager pxDictionarysManager) { this.pxDictionarysManager = pxDictionarysManager; } }
4、web.xml 加载autoLoad类,服务器启动自动加载autoLoad类,如下所示:
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.4" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> <!-- session超时定义,单位为分钟 --> <session-config> <session-timeout>10</session-timeout> </session-config> <!-- 默认首页定义 --> <welcome-file-list> <welcome-file>adminsys/index.htm</welcome-file> </welcome-file-list> <!-- 下载文件 --> <servlet> <servlet-name>ServletDownload</servlet-name> <servlet-class>com.jyd.common.util.ServletDownload</servlet-class> </servlet> <servlet-mapping> <servlet-name>ServletDownload</servlet-name> <url-pattern>/ServletDownload</url-pattern> </servlet-mapping> <!-- Error Page定义 --> <!-- <error-page> <error-code>500</error-code> <location>/commons/error.jsp</location> </error-page> <error-page> <error-code>404</error-code> <location>/commons/404.jsp</location> </error-page> <error-page> <error-code>403</error-code> <location>/commons/403.jsp</location> </error-page> --> <!-- Spring ApplicationContext配置文件的路径,可使用通配符,多个路径用逗号分隔 此参数用于后面的Spring-Context loader --> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath*:spring/applicationContext-*.xml</param-value> </context-param> <!-- <context-param> <param-name>webAppRootKey</param-name> <param-value>dzadmin.root</param-value> </context-param> --> <!-- JSTL i18n定义--> <context-param> <param-name>javax.servlet.jsp.jstl.fmt.localizationContext</param-name> <param-value>i18n/messages</param-value> </context-param> <!--Spring ApplicationContext 载入 --> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <!-- 使Spring支持request与session的scope,如:<bean id="loginAction" class="com.foo.LoginAction" scope="request"/> --> <listener> <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class> </listener> <!-- Spring 刷新Introspector防止内存泄露 --> <listener> <listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class> </listener> <!-- filter start --> <!-- <filter> <filter-name>adminResourceFilter</filter-name> <filter-class>com.jyd.espot.base.interceptor.AdminResourceFilter</filter-class> </filter> --> <!-- Character Encoding filter --> <filter> <filter-name>CharacterEncodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> <init-param> <param-name>forceEncoding</param-name> <param-value>true</param-value> </init-param> </filter> <!-- FlashScope filter,在Flash中存储的数据,在下一次http请求中也可以继续引用,使用方法为Flash.current().error("存在错误"); --> <filter> <filter-name>FlashFilter</filter-name> <filter-class>cn.org.rapid_framework.web.scope.FlashFilter</filter-class> </filter> <!-- LoggerMDCFilter,存放在MDC中的数据,log4j可以直接引用并作为日志信息打印出来. --> <filter> <filter-name>LoggerMDCFilter</filter-name> <filter-class>com.jyd.common.filter.LoggerMDCFilter</filter-class> </filter> <!-- Log4J 配置 add by xiongzhao begin --> <!-- <context-param> <param-name>log4jConfigLocation</param-name> <param-value>classpath:log4j.properties</param-value> </context-param> <listener> <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class> </listener> --> <!-- Log4J 配置 add by xiongzhao end --> <filter> <filter-name>struts2Filter</filter-name> <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> </filter> <!-- filter end --> <!-- filter-mapping start --> <!-- <filter-mapping> <filter-name>adminResourceFilter</filter-name> <url-pattern>/adminsys/jsp/*</url-pattern> </filter-mapping> --> <filter-mapping> <filter-name>CharacterEncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <filter-mapping> <filter-name>FlashFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <filter-mapping> <filter-name>LoggerMDCFilter</filter-name> <url-pattern>*.do</url-pattern> </filter-mapping> <!-- <filter-mapping> <filter-name>LoggerMDCFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> --> <filter-mapping> <filter-name>struts2Filter</filter-name> <url-pattern>*.do</url-pattern> <dispatcher>REQUEST</dispatcher> <dispatcher>FORWARD</dispatcher> </filter-mapping> <!-- filter-mapping end --> <servlet> <servlet-name>autoLoad</servlet-name> <servlet-class>com.jyd.dzadmin.base.AutoLoad</servlet-class> <load-on-startup>1</load-on-startup> </servlet> </web-app>