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>