定时任务实现方式总结
2013-07-01 19:33
405 查看
java timer 实现定时任务
web 应用 利用servlet或listenter 来启动定时任务
1. servlet
2.. listenter
定时任务类TimerManager
任务类:KuanqianDataTimerTask
web.xml 配置
二 利用sping集成的quartz
定时任务实现类
2. 配置applicationContext-timer_task.xml
3. web.xml 中记得加载这个sping文件
现在由于某些原因 定时到达后执行两次任务 后续给上解决方案和原因。。。
web 应用 利用servlet或listenter 来启动定时任务
1. servlet
package com.rc.portal.webapp.action; import java.io.IOException; import java.io.PrintWriter; import java.rmi.RemoteException; import java.sql.SQLException; import java.util.Calendar; import java.util.Date; import java.util.List; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.xml.rpc.ServiceException; import md5.MD5Util; import org.springframework.web.context.support.WebApplicationContextUtils; import com._99bill.sandbox.apipay.services.gatewayOrderQuery.GatewayOrderQuery; import com._99bill.sandbox.apipay.services.gatewayOrderQuery.GatewayOrderQueryServiceLocator; import com.bill99.seashell.domain.dto.gatewayquery.GatewayOrderDetail; import com.bill99.seashell.domain.dto.gatewayquery.GatewayOrderQueryRequest; import com.bill99.seashell.domain.dto.gatewayquery.GatewayOrderQueryResponse; import com.rc.commons.util.DateUtil; import com.rc.portal.dao.QuaiqianOrderQueryDao; import com.rc.portal.dao.impl.QuaiqianOrderQueryDaoImpl; import com.rc.portal.service.QuaiQianOrderQueryManage; import com.rc.portal.service.impl.QuaiQianOrderQueryImpl; import com.rc.portal.vo.QuaiqianOrders; import com.rc.portal.webapp.util.CommonParam; import com.rc.portal.webapp.util.TimerManager; public class KuaiQianServlet extends HttpServlet { TimerManager time=null; ServletContext context; org.springframework.context.ApplicationContext ctx; private QuaiQianOrderQueryManage quaiqianorderquery; private QuaiqianOrderQueryDao query ; private String Errormess; public String getErrormess() { return Errormess; } public void setErrormess(String errormess) { Errormess = errormess; } public QuaiQianOrderQueryManage getQuaiqianorderquery() { return quaiqianorderquery; } public void setQuaiqianorderquery( QuaiQianOrderQueryManage quaiqianorderquery) { this.quaiqianorderquery = quaiqianorderquery; } public QuaiqianOrderQueryDao getQuery() { return query; } public void setQuery(QuaiqianOrderQueryDao query) { this.query = query; } /** * Constructor of the object. */ public KuaiQianServlet() { super(); } /** * Destruction of the servlet. <br> */ public void destroy() { time.timer.cancel(); System.out.println("停止了timer"); } /** * Initialization of the servlet. <br> * * @throws ServletException if an error occurs */ public void init() throws ServletException { System.out.println("我先执行。。。"); // spring是无法为servlet或listenter filter 等由容器来管理的对象注入依赖对象的 此时这样注入。。 context = this.getServletContext() ; ctx= WebApplicationContextUtils.getWebApplicationContext(context); // getBean("bean 的 id 属性") query=(QuaiqianOrderQueryDaoImpl)ctx.getBean("query"); quaiqianorderquery=(QuaiQianOrderQueryImpl)ctx.getBean("quaiqianorderquery"); kuaiQianOrderToSysDatabase(); } private void kuaiQianOrderToSysDatabase() { // TODO Auto-generated method stub Calendar calendar = Calendar.getInstance(); Calendar upcalendar = Calendar.getInstance(); CommonParam param = new CommonParam(); Integer count = 0; try { count = query.getKquaiqinaOrdersCount(); } catch (SQLException e2) { System.out.println("得到快钱订单数量失败。。"); e2.printStackTrace(); } if (count > 0) { List<QuaiqianOrders> q = null; QuaiqianOrders qs=null; try { q = query.getlastDate(); qs=q.get(0); } catch (SQLException e2) { System.out.println("得到最近的快钱订单时间失败。"); e2.printStackTrace(); } if (q != null) { Date d = qs.getRecorddate(); calendar.setTime(d); int sysday = calendar.get(Calendar.DATE); calendar.setTime(new Date()); int upday = calendar.get(Calendar.DATE); if (sysday < upday) { // calendar.setTime(d); // calendar.add(Calendar.DATE, 1); // upcalendar.add(Calendar.DATE, -1); // calendar.set(Calendar.HOUR_OF_DAY, 0); // calendar.set(Calendar.SECOND, 0); // calendar.set(Calendar.MINUTE, 0); // upcalendar.set(Calendar.HOUR_OF_DAY, 23); // upcalendar.set(Calendar.SECOND, 59); // upcalendar.set(Calendar.MINUTE, 59); // String startime = DateUtil.sdfLongTimePlus_s // .format(calendar.getTime()); // String endtime = DateUtil.sdfLongTimePlus_s // .format(upcalendar.getTime()); //人民币账号 //本参数用来指定接收款项的快钱用户的人民币账号 String merchantAcctId="1001213884201"; //客户编号所对应的密钥。。在账户邮箱中获取 String key ="5UHQX2G65W4ECF5G"; //字符集 固定值:1 1代表UTF-8 String inputCharsqet ="1"; //查询接口版本 固定值:v2.0注意为小写字母 String versqion = "v2.0"; //签名类型 固定值:1 1代表MD5加密签名方式 String signType ="1"; //查询模式 固定值:1 1代表简单查询(返回基本订单信息) String queryMode ="1"; //请求记录集页码 在查询结果数据总量很大时,快钱会将支付结果分多次返回。本参数表示商户需要得到的记录集页码。 //默认为1,表示第1页。 String requestPage ="1"; GatewayOrderQueryRequest rsq=new GatewayOrderQueryRequest(); rsq.setInputCharset(inputCharsqet); rsq.setVersion(versqion); rsq.setSignType(Integer.valueOf(signType)); rsq.setMerchantAcctId(merchantAcctId); rsq.setQueryType(1); rsq.setQueryMode(Integer.valueOf(queryMode)); //测试时间 String startime="20130413000000"; String endtime="20130413235959"; rsq.setStartTime(startime); rsq.setEndTime(endtime); rsq.setRequestPage(requestPage); //组合字符串。。必须按照此顺序组串 String signMsgVal=""; signMsgVal = quaiqianorderquery.AppendParam(signMsgVal,"inputCharset",inputCharsqet); signMsgVal = quaiqianorderquery.AppendParam(signMsgVal,"version",versqion); signMsgVal = quaiqianorderquery.AppendParam(signMsgVal,"signType",signType); signMsgVal = quaiqianorderquery.AppendParam(signMsgVal,"merchantAcctId",merchantAcctId); signMsgVal = quaiqianorderquery.AppendParam(signMsgVal,"queryType","1"); signMsgVal =quaiqianorderquery. AppendParam(signMsgVal,"queryMode",queryMode); signMsgVal =quaiqianorderquery. AppendParam(signMsgVal,"startTime",startime); signMsgVal =quaiqianorderquery. AppendParam(signMsgVal,"endTime",endtime); signMsgVal =quaiqianorderquery. AppendParam(signMsgVal,"requestPage",requestPage); signMsgVal =quaiqianorderquery. AppendParam(signMsgVal,"orderId",""); signMsgVal =quaiqianorderquery. AppendParam(signMsgVal,"key",key); //默认singtype=1 即按照md5 方式加密 String signMsg = MD5Util.md5Hex(signMsgVal.getBytes()).toUpperCase(); rsq.setSignMsg(signMsg); GatewayOrderQueryServiceLocator locator = new GatewayOrderQueryServiceLocator(); GatewayOrderQuery gservice = null; GatewayOrderQueryResponse queryResponse = null; try { gservice = locator.getgatewayOrderQuery(); queryResponse = gservice.gatewayOrderQuery(rsq); } catch (RemoteException e1) { System.out.println("获取locator对象失败。。"); e1.printStackTrace(); } catch (ServiceException e1) { System.out.println("获取locator对象失败。。"); e1.printStackTrace(); } //一会改!="" if (!queryResponse.getErrCode().equals("")) { System.out.println("查找快钱订单数据出错..错误信息" + getErrormess()); } else { System.out.println("查找因服务器重启而没有同步至系统数据库中的快钱订单开始。。"); java.util.List<GatewayOrderDetail> lg = query .getQuaiQianOrders(rsq, queryResponse, gservice); System.out.println("执行入库操作开始。。。"); QuaiqianOrders qo=null; for (int i = 0; i < lg.size(); i++) { if(lg.get(i)!=null){ qo=new QuaiqianOrders(); GatewayOrderDetail g=lg.get(i); qo.setDealId(g.getDealId()); qo.setDealTime(DateUtil.stringToDate(g.getDealTime(), "yyyyMMddHHmmss") ); qo.setFee(g.getFee()); qo.setOrderAmount(g.getOrderAmount()); qo.setOrderId(g.getOrderId()); qo.setOrdernum(0); qo.setOrderTime(DateUtil.stringToDate(g.getOrderTime(), "yyyyMMddHHmmss")); qo.setPayType(g.getPayType()); qo.setPayAmount(g.getPayAmount()); try { query.insertQuaiqianDate(qo); } catch (SQLException e) { System.out.println("插入数据失败。。"); e.printStackTrace(); } } } } } } } // 初始时候启动定时任务 定时任务中需要这两个业务类 这里把他们的引用传过去 time=new TimerManager(quaiqianorderquery,query); System.out.println("定时任务启动。。。"); } }
2.. listenter
package com.rc.portal.service.impl; import java.rmi.RemoteException; import java.sql.SQLException; import java.util.Calendar; import java.util.Date; import javax.servlet.ServletContext; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; import javax.xml.rpc.ServiceException; import org.springframework.web.context.support.WebApplicationContextUtils; import md5.MD5Util; import com._99bill.sandbox.apipay.services.gatewayOrderQuery.GatewayOrderQuery; import com._99bill.sandbox.apipay.services.gatewayOrderQuery.GatewayOrderQueryServiceLocator; import com.bill99.seashell.domain.dto.gatewayquery.GatewayOrderDetail; import com.bill99.seashell.domain.dto.gatewayquery.GatewayOrderQueryRequest; import com.bill99.seashell.domain.dto.gatewayquery.GatewayOrderQueryResponse; import com.rc.commons.util.DateUtil; import com.rc.portal.dao.QuaiqianOrderQueryDao; import com.rc.portal.dao.impl.QuaiqianOrderQueryDaoImpl; import com.rc.portal.service.QuaiQianOrderQueryManage; import com.rc.portal.vo.QuaiqianOrders; import com.rc.portal.webapp.util.CommonParam; import com.rc.portal.webapp.util.TimerManager; import com.sun.xml.internal.bind.v2.schemagen.xmlschema.List; public class KuaiqianTaskListener implements ServletContextListener { TimerManager time=null; ServletContext context; org.springframework.context.ApplicationContext ctx; private QuaiQianOrderQueryManage quaiqianorderquery; private QuaiqianOrderQueryDao query ; private String Errormess; public String getErrormess() { return Errormess; } public void setErrormess(String errormess) { Errormess = errormess; } public QuaiQianOrderQueryManage getQuaiqianorderquery() { return quaiqianorderquery; } public void setQuaiqianorderquery( QuaiQianOrderQueryManage quaiqianorderquery) { this.quaiqianorderquery = quaiqianorderquery; } public QuaiqianOrderQueryDao getQuery() { return query; } public void setQuery(QuaiqianOrderQueryDao query) { this.query = query; } @Override public void contextInitialized(ServletContextEvent arg0) { // TODO Auto-generated method stub System.out.println("我先执行。。。"); // 监听器服务启动时调用此方法contextInitialized()其他和servlet一样 context = arg0.getServletContext(); ctx= WebApplicationContextUtils.getWebApplicationContext(context); query=(QuaiqianOrderQueryDaoImpl)ctx.getBean("query"); quaiqianorderquery=(QuaiQianOrderQueryImpl)ctx.getBean("quaiqianorderquery"); kuaiQianOrderToSysDatabase(); } /* * (non-Javadoc) * * @seejavax.servlet.ServletContextListener#contextDestroyed(javax.servlet. * ServletContextEvent) */ @Override public void contextDestroyed(ServletContextEvent arg0) { time.timer.cancel(); System.out.println("停止了timer"); } private void kuaiQianOrderToSysDatabase() { // TODO Auto-generated method stub Calendar calendar = Calendar.getInstance(); Calendar upcalendar = Calendar.getInstance(); CommonParam param = new CommonParam(); Integer count = 0; try { count = query.getKquaiqinaOrdersCount(); } catch (SQLException e2) { System.out.println("得到快钱订单数量失败。。"); e2.printStackTrace(); } // if (count > 0) { // QuaiqianOrders q = null; // try { // //q = query.getlastDate(); // } catch (SQLException e2) { // System.out.println("得到最近的快钱订单时间失败。"); // e2.printStackTrace(); // } if (q != null) { Date d = q.getRecorddate(); calendar.setTime(d); int sysday = calendar.get(Calendar.DATE); calendar.setTime(new Date()); int upday = calendar.get(Calendar.DATE); if (sysday + 1 < upday) { calendar.setTime(d); calendar.add(Calendar.DATE, 1); upcalendar.add(Calendar.DATE, -1); calendar.set(Calendar.HOUR_OF_DAY, 0); calendar.set(Calendar.SECOND, 0); calendar.set(Calendar.MINUTE, 0); upcalendar.set(Calendar.HOUR_OF_DAY, 23); upcalendar.set(Calendar.SECOND, 59); upcalendar.set(Calendar.MINUTE, 59); String startime = DateUtil.sdfLongTimePlus_s .format(calendar.getTime()); String endtime = DateUtil.sdfLongTimePlus_s .format(upcalendar.getTime()); // 以下参数从配置文件中获取 -- start // 人民币账号 // 本参数用来指定接收款项的快钱用户的人民币账号 String merchantAcctId = param.getString("merchantAcctId"); // 客户编号所对应的密钥。。在账户邮箱中获取 String key = param.getString("key"); // 字符集 固定值:1 1代表UTF-8 String inputCharset = param.getString("inputCharset"); // 查询接口版本 固定值:v2.0注意为小写字母 String versqion = param.getString("version"); // 签名类型 固定值:1 1代表MD5加密签名方式 String signType = param.getString("signType"); // 查询模式 固定值:1 1代表简单查询(返回基本订单信息) String queryMode = param.getString("queryMode"); // 请求记录集页码 在查询结果数据总量很大时,快钱会将支付结果分多次返回。本参数表示商户需要得到的记录集页码。 // 默认为1,表示第1页。 String requestPage = param.getString("requestPage"); // --end // 组装请求参数 GatewayOrderQueryRequest rsq = new GatewayOrderQueryRequest(); rsq.setInputCharset(inputCharset); rsq.setVersion(versqion); rsq.setSignType(Integer.valueOf(signType)); rsq.setMerchantAcctId(merchantAcctId); rsq.setQueryType(1); rsq.setQueryMode(1); rsq.setStartTime(startime); rsq.setOrderId(""); rsq.setEndTime(endtime); rsq.setRequestPage(requestPage); // rsq.setStartTime(model.getStartTime()); // 组合字符串。。必须按照此顺序组串 String signMsgVal = ""; signMsgVal = quaiqianorderquery.AppendParam(signMsgVal, "inputCharset", inputCharset); signMsgVal = quaiqianorderquery.AppendParam(signMsgVal, "version", versqion); signMsgVal = quaiqianorderquery.AppendParam(signMsgVal, "signType", signType); signMsgVal = quaiqianorderquery.AppendParam(signMsgVal, "merchantAcctId", merchantAcctId); signMsgVal = quaiqianorderquery.AppendParam(signMsgVal, "queryType", "1"); signMsgVal = quaiqianorderquery.AppendParam(signMsgVal, "queryMode", "1"); signMsgVal = quaiqianorderquery.AppendParam(signMsgVal, "startTime", startime); signMsgVal = quaiqianorderquery.AppendParam(signMsgVal, "endTime", endtime); signMsgVal = quaiqianorderquery.AppendParam(signMsgVal, "requestPage", requestPage); signMsgVal = quaiqianorderquery.AppendParam(signMsgVal, "orderId", ""); signMsgVal = quaiqianorderquery.AppendParam(signMsgVal, "key", key); // 默认singtype=1 即按照md5 方式加密 String signMsg = MD5Util.md5Hex(signMsgVal.getBytes()) .toUpperCase(); rsq.setSignMsg(signMsg); GatewayOrderQueryServiceLocator locator = new GatewayOrderQueryServiceLocator(); GatewayOrderQuery gservice = null; GatewayOrderQueryResponse queryResponse = null; try { gservice = locator.getgatewayOrderQuery(); queryResponse = gservice.gatewayOrderQuery(rsq); } catch (RemoteException e1) { System.out.println("获取locator对象失败。。"); e1.printStackTrace(); } catch (ServiceException e1) { System.out.println("获取locator对象失败。。"); e1.printStackTrace(); } if (queryResponse.getErrCode().equals( quaiqianorderquery.accountError)) { setErrormess("该账号不存在或已注销"); } if (queryResponse.getErrCode().equals( quaiqianorderquery.charsetError)) { setErrormess("字符集输入不正确"); } if (queryResponse.getErrCode().equals( quaiqianorderquery.currentPageNotExistError)) { setErrormess("当前记录的页码不存在"); } if (queryResponse.getErrCode().equals( quaiqianorderquery.endTimeError)) { setErrormess("查询结束时间不正确"); } if (queryResponse.getErrCode().equals( quaiqianorderquery.merchantAcctIdError)) { setErrormess("人民币账号格式不正确"); } if (queryResponse.getErrCode().equals( quaiqianorderquery.orderForPayNotSuccessError)) { setErrormess("订单号对应的交易未成功"); } if (queryResponse.getErrCode().equals( quaiqianorderquery.orderId)) { setErrormess("商户订单号格式不正确"); } if (queryResponse.getErrCode().equals( quaiqianorderquery.orderNotExistError)) { setErrormess("商户订单号不存在"); } if (queryResponse.getErrCode().equals( quaiqianorderquery.queryEndTimeGtTodayTime)) { setErrormess("查询结束时间晚于当前时间"); } if (queryResponse.getErrCode().equals( quaiqianorderquery.queryExceptionError)) { setErrormess("查询过程异常,请稍后再试"); } if (queryResponse.getErrCode().equals( quaiqianorderquery.queryModeError)) { setErrormess("查询模式不正确或不存在"); } if (queryResponse.getErrCode().equals( quaiqianorderquery.queryResultGtfileScopeError)) { setErrormess("查询结果超出能允许的文件范围"); } if (queryResponse.getErrCode().equals( quaiqianorderquery.queryStartLtEndTimeError)) { setErrormess("开始时间不能再结束时间之后"); } if (queryResponse.getErrCode().equals( quaiqianorderquery.singTypeError)) { setErrormess("签名类型不正确或不存在"); } if (queryResponse.getErrCode().equals( quaiqianorderquery.startTimeError)) { setErrormess("查询开始时间不正确"); } if (queryResponse.getErrCode().equals( quaiqianorderquery.systemBusy)) { setErrormess("系统忙,请稍后再试"); } if (queryResponse.getErrCode().equals( quaiqianorderquery.timeInnerNotDateError)) { setErrormess("本段时间内无交易记录"); } if (queryResponse.getErrCode().equals( quaiqianorderquery.timeInnerNotSuccessDateError)) { setErrormess("本段时间内无成功交易记录"); } if (queryResponse.getErrCode().equals( quaiqianorderquery.unKnownError)) { setErrormess("未知错误"); } if (queryResponse.getErrCode().equals( quaiqianorderquery.versionError)) { setErrormess("网关版本号不正确或不存在"); } if (queryResponse.getErrCode().equals( quaiqianorderquery.queryTimeOnlyIsThirtyDaysError)) { setErrormess("允许查询的时间最长为30天"); } if (queryResponse.getErrCode().equals( quaiqianorderquery.queryTypeError)) { setErrormess("查询方式不正确或不存在"); } if (queryResponse.getErrCode().equals( quaiqianorderquery.singMsgError)) { setErrormess("签名字符串不匹配"); } if (queryResponse.getErrCode().equals( quaiqianorderquery.singMsgPowerError)) { setErrormess("签名字符串不匹配,你无权查询"); } if (queryResponse.getErrCode() != "") { System.out.println("查找快钱订单数据出错..错误信息" + getErrormess()); } else { System.out.println("查找因服务器重启而没有同步至系统数据库中的快钱订单开始。。"); java.util.List<GatewayOrderDetail> lg = query .getQuaiQianOrders(rsq, queryResponse, gservice); System.out.println("执行入库操作开始。。。"); for (int i = 0; i < lg.size(); i++) { try { // query.insertQuaiqianDate(lg.get(i)); } catch (SQLException e) { System.out.println("插入数据失败。。"); e.printStackTrace(); } } } } } } // 启动定时任务 time=new TimerManager(quaiqianorderquery,query); System.out.println("定时任务启动。。。"); } }
定时任务类TimerManager
package com.rc.portal.webapp.util; import java.util.Calendar; import java.util.Date; import java.util.Timer; import com.rc.portal.dao.QuaiqianOrderQueryDao; import com.rc.portal.service.QuaiQianOrderQueryManage; public class TimerManager { //时间间隔 private static final long PERIOD_DAY = 24 * 60 * 60 * 1000; public Timer timer=null; public TimerManager( QuaiQianOrderQueryManage quaiqianorderquery,QuaiqianOrderQueryDao query) { Calendar calendar = Calendar.getInstance(); /*** 定制每日0:00执行方法 ***/ calendar.set(Calendar.HOUR_OF_DAY, 0); calendar.set(Calendar.MINUTE, 0); calendar.set(Calendar.SECOND, 0); Date date=calendar.getTime(); //第一次执行定时任务的时间 //如果第一次执行定时任务的时间 小于 当前的时间 //此时要在 第一次执行定时任务的时间 加一天,以便此任务在下个时间点执行。如果不加一天,任务会立即执行。 // if (date.before(new Date())) { // date = this.addDay(date, 1); // } timer = new Timer(); // 定义一个任务执行类 KuanqianDataTimerTask task = new KuanqianDataTimerTask(); task.setQuaiqianorderquery(quaiqianorderquery); task.setQuery(query); //安排指定的任务在指定的时间开始进行重复的固定延迟执行 (到时间执行task实例的run()方法)。 timer.schedule(task,date,PERIOD_DAY); // 这是指定时间点了 到这个点执行每过ERIOD_DAY到这个点都执行 如果 timer.schedule(task,0,PERIOD_DAY); 服务启动0秒后执行(可以自由设置时间只要不是时间点是秒数就ok) 每隔PERIOD_DAY时间执行一次 } // 增加或减少天数 public Date addDay(Date date, int num) { Calendar startDT = Calendar.getInstance(); startDT.setTime(date); startDT.add(Calendar.DAY_OF_MONTH, num); return startDT.getTime(); } // 在 TimerManager 这个类里面,大家一定要注意 时间点的问题。如果你设定在凌晨2点执行任务。但你是在2点以后 // 发布的程序或是重启过服务,那这样的情况下,任务会立即执行,而不是等到第二天的凌晨2点执行。为了,避免这种情况 // 发生,只能判断一下,如果发布或重启服务的时间晚于定时执行任务的时间,就在此基础上加一天。 }
任务类:KuanqianDataTimerTask
package com.rc.portal.webapp.util; import java.rmi.RemoteException; import java.sql.SQLException; import java.util.Calendar; import java.util.Date; import java.util.TimerTask; import javax.xml.rpc.ServiceException; import md5.MD5Util; import com._99bill.sandbox.apipay.services.gatewayOrderQuery.GatewayOrderQuery; import com._99bill.sandbox.apipay.services.gatewayOrderQuery.GatewayOrderQueryServiceLocator; import com.bill99.seashell.domain.dto.gatewayquery.GatewayOrderDetail; import com.bill99.seashell.domain.dto.gatewayquery.GatewayOrderQueryRequest; import com.bill99.seashell.domain.dto.gatewayquery.GatewayOrderQueryResponse; import com.rc.commons.util.DateUtil; import com.rc.portal.dao.QuaiqianOrderQueryDao; import com.rc.portal.service.QuaiQianOrderQueryManage; import com.rc.portal.vo.QuaiqianOrders; public class KuanqianDataTimerTask extends TimerTask { private QuaiQianOrderQueryManage quaiqianorderquery; private QuaiqianOrderQueryDao query ; private String Errormess; public String getErrormess() { return Errormess; } public void setErrormess(String errormess) { Errormess = errormess; } public QuaiQianOrderQueryManage getQuaiqianorderquery() { return quaiqianorderquery; } public void setQuaiqianorderquery( QuaiQianOrderQueryManage quaiqianorderquery) { this.quaiqianorderquery = quaiqianorderquery; } public QuaiqianOrderQueryDao getQuery() { return query; } public void setQuery(QuaiqianOrderQueryDao query) { this.query = query; } @Override public void run() { try { System.out.println("服务器启动开始执行入库当天数据。。"); kuaiQianOrdertoSysDatabase(); } catch (Exception e) { System.out.println("run返回异常。"); e.printStackTrace(); } } public void kuaiQianOrdertoSysDatabase() { // TODO Auto-generated method stub System.out.println("开始执行当天数据的入库。。。"); // Calendar calendar = Calendar.getInstance(); // Calendar upcalendar = Calendar.getInstance(); CommonParam param = new CommonParam(); // // calendar.setTime(new Date()); // upcalendar.setTime(new Date()); // calendar.add(Calendar.DATE, -1); // upcalendar.add(Calendar.DATE, -1); // calendar.set(Calendar.HOUR_OF_DAY, 0); // calendar.set(Calendar.MINUTE, 0); // calendar.set(Calendar.SECOND, 0); // upcalendar.set(Calendar.HOUR_OF_DAY, 23); // upcalendar.set(Calendar.SECOND, 59); // upcalendar.set(Calendar.MINUTE, 59); // System.out.println(calendar.getTime()); // System.out.println(upcalendar.getTime()); // String startime = DateUtil.sdfLongTimePlus_s.format(calendar.getTime()); // String endtime = DateUtil.sdfLongTimePlus_s // .format(upcalendar.getTime()); //测试时间 String startime="20130413000000"; String endtime="20130413235959"; //人民币账号 //本参数用来指定接收款项的快钱用户的人民币账号 String merchantAcctId="1001213884201"; //客户编号所对应的密钥。。在账户邮箱中获取 String key ="5UHQX2G65W4ECF5G"; //字符集 固定值:1 1代表UTF-8 String inputCharsqet ="1"; //查询接口版本 固定值:v2.0注意为小写字母 String versqion = "v2.0"; //签名类型 固定值:1 1代表MD5加密签名方式 String signType ="1"; //查询模式 固定值:1 1代表简单查询(返回基本订单信息) String queryMode ="1"; //请求记录集页码 在查询结果数据总量很大时,快钱会将支付结果分多次返回。本参数表示商户需要得到的记录集页码。 //默认为1,表示第1页。 String requestPage ="1"; GatewayOrderQueryRequest rsq=new GatewayOrderQueryRequest(); rsq.setInputCharset(inputCharsqet); rsq.setVersion(versqion); rsq.setSignType(Integer.valueOf(signType)); rsq.setMerchantAcctId(merchantAcctId); rsq.setQueryType(1); rsq.setQueryMode(Integer.valueOf(queryMode)); rsq.setStartTime(startime); rsq.setEndTime(endtime); rsq.setRequestPage(requestPage); //组合字符串。。必须按照此顺序组串 String signMsgVal=""; signMsgVal = quaiqianorderquery.AppendParam(signMsgVal,"inputCharset",inputCharsqet); signMsgVal = quaiqianorderquery.AppendParam(signMsgVal,"version",versqion); signMsgVal = quaiqianorderquery.AppendParam(signMsgVal,"signType",signType); signMsgVal = quaiqianorderquery.AppendParam(signMsgVal,"merchantAcctId",merchantAcctId); signMsgVal = quaiqianorderquery.AppendParam(signMsgVal,"queryType","1"); signMsgVal =quaiqianorderquery. AppendParam(signMsgVal,"queryMode",queryMode); signMsgVal =quaiqianorderquery. AppendParam(signMsgVal,"startTime",startime); signMsgVal =quaiqianorderquery. AppendParam(signMsgVal,"endTime",endtime); signMsgVal =quaiqianorderquery. AppendParam(signMsgVal,"requestPage",requestPage); signMsgVal =quaiqianorderquery. AppendParam(signMsgVal,"orderId",""); signMsgVal =quaiqianorderquery. AppendParam(signMsgVal,"key",key); //默认singtype=1 即按照md5 方式加密 String signMsg = MD5Util.md5Hex(signMsgVal.getBytes()).toUpperCase(); rsq.setSignMsg(signMsg); GatewayOrderQueryServiceLocator locator = new GatewayOrderQueryServiceLocator(); GatewayOrderQuery gservice = null; GatewayOrderQueryResponse queryResponse = null; try { gservice = locator.getgatewayOrderQuery(); queryResponse = gservice.gatewayOrderQuery(rsq); } catch (RemoteException e1) { System.out.println("获取locator对象失败。。"); e1.printStackTrace(); } catch (ServiceException e1) { System.out.println("获取locator对象失败。。"); e1.printStackTrace(); } if (queryResponse.getErrCode().equals(quaiqianorderquery.accountError)) { setErrormess("该账号不存在或已注销"); } if (queryResponse.getErrCode().equals(quaiqianorderquery.charsetError)) { setErrormess("字符集输入不正确"); } if (queryResponse.getErrCode().equals( quaiqianorderquery.currentPageNotExistError)) { setErrormess("当前记录的页码不存在"); } if (queryResponse.getErrCode().equals(quaiqianorderquery.endTimeError)) { setErrormess("查询结束时间不正确"); } if (queryResponse.getErrCode().equals( quaiqianorderquery.merchantAcctIdError)) { setErrormess("人民币账号格式不正确"); } if (queryResponse.getErrCode().equals( quaiqianorderquery.orderForPayNotSuccessError)) { setErrormess("订单号对应的交易未成功"); } if (queryResponse.getErrCode().equals(quaiqianorderquery.orderId)) { setErrormess("商户订单号格式不正确"); } if (queryResponse.getErrCode().equals( quaiqianorderquery.orderNotExistError)) { setErrormess("商户订单号不存在"); } if (queryResponse.getErrCode().equals( quaiqianorderquery.queryEndTimeGtTodayTime)) { setErrormess("查询结束时间晚于当前时间"); } if (queryResponse.getErrCode().equals( quaiqianorderquery.queryExceptionError)) { setErrormess("查询过程异常,请稍后再试"); } if (queryResponse.getErrCode() .equals(quaiqianorderquery.queryModeError)) { setErrormess("查询模式不正确或不存在"); } if (queryResponse.getErrCode().equals( quaiqianorderquery.queryResultGtfileScopeError)) { setErrormess("查询结果超出能允许的文件范围"); } if (queryResponse.getErrCode().equals( quaiqianorderquery.queryStartLtEndTimeError)) { setErrormess("开始时间不能再结束时间之后"); } if (queryResponse.getErrCode().equals(quaiqianorderquery.singTypeError)) { setErrormess("签名类型不正确或不存在"); } if (queryResponse.getErrCode() .equals(quaiqianorderquery.startTimeError)) { setErrormess("查询开始时间不正确"); } if (queryResponse.getErrCode().equals(quaiqianorderquery.systemBusy)) { setErrormess("系统忙,请稍后再试"); } if (queryResponse.getErrCode().equals( quaiqianorderquery.timeInnerNotDateError)) { setErrormess("本段时间内无交易记录"); } if (queryResponse.getErrCode().equals( quaiqianorderquery.timeInnerNotSuccessDateError)) { setErrormess("本段时间内无成功交易记录"); } if (queryResponse.getErrCode().equals(quaiqianorderquery.unKnownError)) { setErrormess("未知错误"); } if (queryResponse.getErrCode().equals(quaiqianorderquery.versionError)) { setErrormess("网关版本号不正确或不存在"); } if (queryResponse.getErrCode().equals( quaiqianorderquery.queryTimeOnlyIsThirtyDaysError)) { setErrormess("允许查询的时间最长为30天"); } if (queryResponse.getErrCode() .equals(quaiqianorderquery.queryTypeError)) { setErrormess("查询方式不正确或不存在"); } if (queryResponse.getErrCode().equals(quaiqianorderquery.singMsgError)) { setErrormess("签名字符串不匹配"); } if (queryResponse.getErrCode().equals( quaiqianorderquery.singMsgPowerError)) { setErrormess("签名字符串不匹配,你无权查询"); } if (queryResponse.getErrCode()!="") { System.out.println("查找快钱订单数据出错..错误信息" + getErrormess()); } else { System.out.println("查找每一天的快钱订单开始。。"); java.util.List<GatewayOrderDetail> lg = query.getQuaiQianOrders( rsq, queryResponse, gservice); System.out.println("执行入库操作开始。。。"); QuaiqianOrders qo=null; for (int i = 0; i < lg.size(); i++) { qo=new QuaiqianOrders(); GatewayOrderDetail g=lg.get(i); qo.setDealId(g.getDealId()); qo.setDealTime(DateUtil.stringToDate(g.getDealTime(), "yyyyMMddHHmmss") ); qo.setFee(g.getFee()); qo.setOrderAmount(g.getOrderAmount()); qo.setOrderId(g.getOrderId()); qo.setOrdernum(0); qo.setOrderTime(DateUtil.stringToDate(g.getOrderTime(), "yyyyMMddHHmmss")); qo.setPayType(g.getPayType()); qo.setPayAmount(g.getPayAmount()); try { query.insertQuaiqianDate(qo); } catch (SQLException e) { System.out.println("插入数据失败。。"); e.printStackTrace(); } } } System.out.println("开始执行当天数据的入库end。。。"); } }
web.xml 配置
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd"> <web-app> <display-name>portal project</display-name> <context-param> <param-name>webAppRootKey</param-name> <param-value>drugManage.root</param-value> </context-param> <!-- Log4j Configuration locations --> <context-param> <param-name>log4jConfigLocation</param-name> <param-value>/WEB-INF/classes/log4j.properties</param-value> </context-param> <context-param> <param-name>log4jRefreshInterval</param-name> <param-value>60000</param-value> </context-param> <!-- 平台选择验证 必须在springSecurityFilterChain之前--> <!-- <filter> <filter-name>platformFilter</filter-name> <filter-class>com.rc.portal.webapp.filter.PlatformFilter</filter-class> </filter> <filter-mapping> <filter-name>platformFilter</filter-name> <url-pattern>/j_spring_security_check</url-pattern> </filter-mapping> --> <!-- 验证码 必须在springSecurityFilterChain之前--> <filter> <filter-name>CodeFilter</filter-name> <filter-class>com.rc.portal.webapp.filter.CodeFilter</filter-class> </filter> <filter-mapping> <filter-name>CodeFilter</filter-name> <url-pattern>/j_spring_security_check</url-pattern> </filter-mapping> !--用servlet方式的配置 <servlet><servlet-name>action</servlet-name><servlet-class>com.rc.portal.webapp.action.KuaiQianServlet</servlet-class>!-- 让服务器启动的时候加载servlet<load-on-startup>1</load-on-startup></servlet> !-- 用listenter方式的配置<listener><listener-class>com.rc.portal.service.impl.KuanqianDataTimerTask</listener-class></listener> <listener> <listener-class> org.springframework.web.util.Log4jConfigListener </listener-class> </listener> <!-- Context Configuration locations for Spring XML files --> <context-param> <param-name>contextConfigLocation</param-name> <param-value> /WEB-INF/classes/applicationContext-*.xml </param-value> </context-param> <listener> <listener-class> org.springframework.web.context.ContextLoaderListener </listener-class> </listener> <servlet> <servlet-name>action</servlet-name> <servlet-class> com.opensymphony.webwork.dispatcher.ServletDispatcher </servlet-class> <load-on-startup>1</load-on-startup> </servlet> <!--springSecurity过滤器--> <filter> <filter-name>springSecurityFilterChain</filter-name> <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> </filter> <filter-mapping> <filter-name>springSecurityFilterChain</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <filter> <filter-name>ParameterCleanUp</filter-name> <filter-class> com.rc.portal.webapp.filter.ParameterFilter </filter-class> </filter> <filter-mapping> <filter-name>ParameterCleanUp</filter-name> <url-pattern>*.htm</url-pattern> </filter-mapping> <filter-mapping> <filter-name>ParameterCleanUp</filter-name> <url-pattern>*.action</url-pattern> </filter-mapping> <filter> <filter-name>ActionContextCleanUp</filter-name> <filter-class> com.opensymphony.webwork.dispatcher.ActionContextCleanUp </filter-class> </filter> <filter-mapping> <filter-name>ActionContextCleanUp</filter-name> <url-pattern>*.htm</url-pattern> </filter-mapping> <filter-mapping> <filter-name>ActionContextCleanUp</filter-name> <url-pattern>*.action</url-pattern> </filter-mapping> <!-- FreeMarker view servlet (to replace JSP) --> <servlet> <servlet-name>freemarker</servlet-name> <servlet-class> freemarker.ext.servlet.FreemarkerServlet </servlet-class> <!-- FreemarkerServlet settings: --> <init-param> <param-name>TemplatePath</param-name> <param-value>/</param-value> </init-param> <init-param> <param-name>NoCache</param-name> <param-value>true</param-value> </init-param> <init-param> <param-name>ContentType</param-name> <param-value>text/html</param-value> </init-param> <!-- FreeMarker settings: --> <init-param> <param-name>template_update_delay</param-name> <param-value>0</param-value> <!-- 0 is for development only! Use higher value otherwise. --> </init-param> <init-param> <param-name>default_encoding</param-name> <param-value>UTF-8</param-value> </init-param> <init-param> <param-name>locale</param-name> <param-value>zh_CN</param-value> </init-param> <init-param> <param-name>number_format</param-name> <param-value>0.##########</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet> <servlet-name>MakeImageServlet</servlet-name> <servlet-class> com.rc.app.framework.webapp.servlet.MakeImageServlet </servlet-class> </servlet> <servlet-mapping> <servlet-name>MakeImageServlet</servlet-name> <url-pattern>/sltMakeImage</url-pattern> </servlet-mapping> <!-- 加载标签库 --> <servlet> <servlet-name>JspSupportServlet</servlet-name> <servlet-class> com.opensymphony.webwork.views.JspSupportServlet </servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>action</servlet-name> <url-pattern>*.htm</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>action</servlet-name> <url-pattern>*.action</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>freemarker</servlet-name> <url-pattern>*.ftl</url-pattern> </servlet-mapping> <session-config> <session-timeout>60</session-timeout> </session-config> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> <!-- Add by yinbin for Error page show --> <error-page> <error-code>404</error-code> <location>/web/exception/404.jsp</location> </error-page> <error-page> <error-code>500</error-code> <location>/web/exception/404.jsp</location> </error-page> <error-page> <exception-type>java.lang.NullPointerException</exception-type> <location>/web/exception/404.jsp</location> </error-page> <error-page> <exception-type> com.opensymphony.xwork.config.ConfigurationException </exception-type> <location>/web/exception/404.jsp</location> </error-page> <error-page> <exception-type> freemarker.template.TemplateModelException </exception-type> <location>/web/exception/404.jsp</location> </error-page> <error-page> <exception-type>java.lang.NoClassDefFoundError</exception-type> <location>/web/exception/404.jsp</location> </error-page> <error-page> <exception-type>java.lang.NumberFormatException</exception-type> <location>/web/exception/404.jsp</location> </error-page> </web-app>
二 利用sping集成的quartz
定时任务实现类
package com.rc.portal.webapp.util; import java.rmi.RemoteException; import java.sql.SQLException; import java.text.ParseException; import java.util.Calendar; import java.util.Date; import java.util.List; import javax.xml.rpc.ServiceException; import md5.MD5Util; import com._99bill.sandbox.apipay.services.gatewayOrderQuery.GatewayOrderQuery; import com._99bill.sandbox.apipay.services.gatewayOrderQuery.GatewayOrderQueryServiceLocator; import com.bill99.seashell.domain.dto.gatewayquery.GatewayOrderDetail; import com.bill99.seashell.domain.dto.gatewayquery.GatewayOrderQueryRequest; import com.bill99.seashell.domain.dto.gatewayquery.GatewayOrderQueryResponse; import com.rc.commons.util.DateUtil; import com.rc.portal.dao.QuaiqianOrderQueryDao; import com.rc.portal.service.QuaiQianOrderQueryManage; import com.rc.portal.vo.QuaiqianOrders; public class KuaiqianTask { private QuaiQianOrderQueryManage quaiqianorderquery; private QuaiqianOrderQueryDao query; private String Errormess; //static int searchIndexFlag =0;//由doBuildIndex修改,其他方法不要修改此参数 public String getErrormess() { return Errormess; } public void setErrormess(String errormess) { Errormess = errormess; } public QuaiQianOrderQueryManage getQuaiqianorderquery() { return quaiqianorderquery; } public void setQuaiqianorderquery( QuaiQianOrderQueryManage quaiqianorderquery) { this.quaiqianorderquery = quaiqianorderquery; } public QuaiqianOrderQueryDao getQuery() { return query; } public void setQuery(QuaiqianOrderQueryDao query) { this.query = query; } int count = 0; public void run() { //定时器同时调用两次的问题需要查找原因 这种问题我感觉是服务器加载两次项目 生成了两个线程 。。 根本原因还是tomcat 问题。 // if(searchIndexFlag>0)return ;//保证同一时刻只有一个定时器运行,通过这种方式保证每次定时时间到时,只执行一个线程 // searchIndexFlag = 1;//锁定 System.out.println("执行。。。"); if (count == 0) { kuaiQianOrderToSysDatabase_one(); count++; } else{ try { System.out.println("服务器启动开始执行入库昨天数据。。"); kuaiQianOrdertoSysDatabase(); } catch (Exception e) { System.out.println("run返回异常。"); e.printStackTrace(); } } } private void kuaiQianOrderToSysDatabase_one() { // TODO Auto-generated method stub Calendar calendar = Calendar.getInstance(); Calendar upcalendar = Calendar.getInstance(); CommonParam param = new CommonParam(); Integer count = 0; try { count = query.getKquaiqinaOrdersCount(); } catch (SQLException e2) { System.out.println("得到快钱订单数量失败。。"); e2.printStackTrace(); } if (count > 0) { List<QuaiqianOrders> q = null; QuaiqianOrders qs = null; try { q = query.getlastDate(); qs = q.get(0); } catch (SQLException e2) { System.out.println("得到最近的快钱订单时间失败。"); e2.printStackTrace(); } if (q != null) { Date d = qs.getRecorddate(); calendar.setTime(d); upcalendar.setTime(new Date()); int sysday = calendar.get(Calendar.DATE); int upday = upcalendar.get(Calendar.DATE); if (sysday < upday) { upcalendar.add(Calendar.DATE, -1); calendar.set(Calendar.HOUR_OF_DAY, 0); calendar.set(Calendar.SECOND, 0); calendar.set(Calendar.MINUTE, 0); upcalendar.set(Calendar.HOUR_OF_DAY, 23); upcalendar.set(Calendar.SECOND, 59); upcalendar.set(Calendar.MINUTE, 59); String startime = DateUtil.sdfLongTimePlus_s .format(calendar.getTime()); String endtime = DateUtil.sdfLongTimePlus_s .format(upcalendar.getTime()); System.out.println("补数据"+startime); System.out.println("补数据"+endtime); //从配置文件中获取 签名字符串不正确.. 后续找找原因. // 人民币账号 // 本参数用来指定接收款项的快钱用户的人民币账号 String merchantAcctId =param.getString("merchantAcctId");// "1001213884201"; // 客户编号所对应的密钥。。在账户邮箱中获取 String key = param.getString("key");// "5UHQX2G65W4ECF5G"; // 字符集 固定值:1 1代表UTF-8 String inputCharsqet =param.getString("inputCharset");// "1"; // 查询接口版本 固定值:v2.0注意为小写字母 String versqion = param.getString("version");// "v2.0"; // 签名类型 固定值:1 1代表MD5加密签名方式 String signType =param.getString("signType");// "1"; // 查询模式 固定值:1 1代表简单查询(返回基本订单信息) String queryMode =param.getString("queryMode");// "1"; // 请求记录集页码 在查询结果数据总量很大时,快钱会将支付结果分多次返回。本参数表示商户需要得到的记录集页码。 // 默认为1,表示第1页。 String requestPage =param.getString("requestPage");//"1"; // // // 人民币账号 // // 本参数用来指定接收款项的快钱用户的人民币账号 // String merchantAcctId ="1001213884201"; // // 客户编号所对应的密钥。。在账户邮箱中获取 // String key ="5UHQX2G65W4ECF5G"; // // 字符集 固定值:1 1代表UTF-8 // String inputCharsqet ="1"; // // 查询接口版本 固定值:v2.0注意为小写字母 // String versqion = "v2.0"; // // 签名类型 固定值:1 1代表MD5加密签名方式 // String signType ="1"; // // 查询模式 固定值:1 1代表简单查询(返回基本订单信息) // String queryMode ="1"; // // 请求记录集页码 在查询结果数据总量很大时,快钱会将支付结果分多次返回。本参数表示商户需要得到的记录集页码。 // // 默认为1,表示第1页。 // String requestPage ="1"; GatewayOrderQueryRequest rsq = new GatewayOrderQueryRequest(); rsq.setInputCharset(inputCharsqet); rsq.setVersion(versqion); rsq.setSignType(Integer.valueOf(signType)); rsq.setMerchantAcctId(merchantAcctId); rsq.setQueryType(1); rsq.setQueryMode(Integer.valueOf(queryMode)); //// ////// // 测试时间 //////// // String startime = "20130617000000"; // String endtime = "20130617235959"; rsq.setStartTime(startime); rsq.setEndTime(endtime); rsq.setRequestPage(requestPage); // 组合字符串。。必须按照此顺序组串 String signMsgVal = ""; signMsgVal = quaiqianorderquery.AppendParam(signMsgVal, "inputCharset", inputCharsqet); signMsgVal = quaiqianorderquery.AppendParam(signMsgVal, "version", versqion); signMsgVal = quaiqianorderquery.AppendParam(signMsgVal, "signType", signType); signMsgVal = quaiqianorderquery.AppendParam(signMsgVal, "merchantAcctId", merchantAcctId); signMsgVal = quaiqianorderquery.AppendParam(signMsgVal, "queryType", "1"); signMsgVal = quaiqianorderquery.AppendParam(signMsgVal, "queryMode", queryMode); signMsgVal = quaiqianorderquery.AppendParam(signMsgVal, "startTime", startime); signMsgVal = quaiqianorderquery.AppendParam(signMsgVal, "endTime", endtime); signMsgVal = quaiqianorderquery.AppendParam(signMsgVal, "requestPage", requestPage); signMsgVal = quaiqianorderquery.AppendParam(signMsgVal, "orderId", ""); signMsgVal = quaiqianorderquery.AppendParam(signMsgVal, "key", key); // 默认singtype=1 即按照md5 方式加密 String signMsg = MD5Util.md5Hex(signMsgVal.getBytes()) .toUpperCase(); rsq.setSignMsg(signMsg); GatewayOrderQueryServiceLocator locator = new GatewayOrderQueryServiceLocator(); GatewayOrderQuery gservice = null; GatewayOrderQueryResponse queryResponse = null; try { gservice = locator.getgatewayOrderQuery(); queryResponse = gservice.gatewayOrderQuery(rsq); } catch (RemoteException e1) { System.out.println("获取locator对象失败。。"); e1.printStackTrace(); } catch (ServiceException e1) { System.out.println("获取locator对象失败。。"); e1.printStackTrace(); } if (queryResponse.getErrCode().equals(quaiqianorderquery.accountError)) { setErrormess("该账号不存在或已注销"); } if (queryResponse.getErrCode().equals(quaiqianorderquery.charsetError)) { setErrormess("字符集输入不正确"); } if (queryResponse.getErrCode().equals( quaiqianorderquery.currentPageNotExistError)) { setErrormess("当前记录的页码不存在"); } if (queryResponse.getErrCode().equals(quaiqianorderquery.endTimeError)) { setErrormess("查询结束时间不正确"); } if (queryResponse.getErrCode().equals( quaiqianorderquery.merchantAcctIdError)) { setErrormess("人民币账号格式不正确"); } if (queryResponse.getErrCode().equals( quaiqianorderquery.orderForPayNotSuccessError)) { setErrormess("订单号对应的交易未成功"); } if (queryResponse.getErrCode().equals(quaiqianorderquery.orderId)) { setErrormess("商户订单号格式不正确"); } if (queryResponse.getErrCode().equals( quaiqianorderquery.orderNotExistError)) { setErrormess("商户订单号不存在"); } if (queryResponse.getErrCode().equals( quaiqianorderquery.queryEndTimeGtTodayTime)) { setErrormess("查询结束时间晚于当前时间"); } if (queryResponse.getErrCode().equals( quaiqianorderquery.queryExceptionError)) { setErrormess("查询过程异常,请稍后再试"); } if (queryResponse.getErrCode() .equals(quaiqianorderquery.queryModeError)) { setErrormess("查询模式不正确或不存在"); } if (queryResponse.getErrCode().equals( quaiqianorderquery.queryResultGtfileScopeError)) { setErrormess("查询结果超出能允许的文件范围"); } if (queryResponse.getErrCode().equals( quaiqianorderquery.queryStartLtEndTimeError)) { setErrormess("开始时间不能再结束时间之后"); } if (queryResponse.getErrCode().equals(quaiqianorderquery.singTypeError)) { setErrormess("签名类型不正确或不存在"); } if (queryResponse.getErrCode() .equals(quaiqianorderquery.startTimeError)) { setErrormess("查询开始时间不正确"); } if (queryResponse.getErrCode().equals(quaiqianorderquery.systemBusy)) { setErrormess("系统忙,请稍后再试"); } if (queryResponse.getErrCode().equals( quaiqianorderquery.timeInnerNotDateError)) { setErrormess("本段时间内无交易记录"); } if (queryResponse.getErrCode().equals( quaiqianorderquery.timeInnerNotSuccessDateError)) { setErrormess("本段时间内无成功交易记录"); } if (queryResponse.getErrCode().equals(quaiqianorderquery.unKnownError)) { setErrormess("未知错误"); } if (queryResponse.getErrCode().equals(quaiqianorderquery.versionError)) { setErrormess("网关版本号不正确或不存在"); } if (queryResponse.getErrCode().equals( quaiqianorderquery.queryTimeOnlyIsThirtyDaysError)) { setErrormess("允许查询的时间最长为30天"); } if (queryResponse.getErrCode() .equals(quaiqianorderquery.queryTypeError)) { setErrormess("查询方式不正确或不存在"); } if (queryResponse.getErrCode().equals(quaiqianorderquery.singMsgError)) { setErrormess("签名字符串不匹配"); } if (queryResponse.getErrCode().equals( quaiqianorderquery.singMsgPowerError)) { setErrormess("签名字符串不匹配,你无权查询"); } // 一会改!="" if (!queryResponse.getErrCode().equals("")) { System.out.println("查找快钱订单数据出错..错误信息 " + getErrormess()); } else { System.out.println("查找因服务器重启而没有同步至系统数据库中的快钱订单开始。。"); java.util.List<GatewayOrderDetail> lg = query .getQuaiQianOrders(rsq, queryResponse, gservice); System.out.println("执行入库操作开始。。。"); QuaiqianOrders qo = null; for (int i = 0; i < lg.size(); i++) { if (lg.get(i) != null) { qo = new QuaiqianOrders(); GatewayOrderDetail g = lg.get(i); qo.setDealId(g.getDealId()); try { qo.setDealTime(DateUtil.fromStringToDate("yyyyMMddHHmmss",g.getDealTime())); qo.setOrderTime(DateUtil.fromStringToDate("yyyyMMddHHmmss",g.getDealTime())); } catch (ParseException e1) { System.out.println("转换出错了"); // TODO Auto-generated catch block e1.printStackTrace(); } qo.setFee(g.getFee()/100); qo.setOrderAmount(g.getOrderAmount()/100); qo.setOrderId(g.getOrderId()); qo.setOrdernum(0); qo.setPayType(g.getPayType()); qo.setPayAmount(g.getPayAmount()/100); try { query.insertQuaiqianDate(qo); } catch (SQLException e) { System.out.println("插入数据失败。。"); e.printStackTrace(); } } } } } } } } public void kuaiQianOrdertoSysDatabase() { // TODO Auto-generated method stub System.out.println("开始执行当天数据的入库。。。"); Calendar calendar = Calendar.getInstance(); Calendar upcalendar = Calendar.getInstance(); CommonParam param = new CommonParam(); // calendar.setTime(new Date()); upcalendar.setTime(new Date()); calendar.add(Calendar.DATE, -1); upcalendar.add(Calendar.DATE, -1); calendar.set(Calendar.HOUR_OF_DAY, 0); calendar.set(Calendar.MINUTE, 0); calendar.set(Calendar.SECOND, 0); upcalendar.set(Calendar.HOUR_OF_DAY, 23); upcalendar.set(Calendar.SECOND, 59); upcalendar.set(Calendar.MINUTE, 59); System.out.println(calendar.getTime()); System.out.println(upcalendar.getTime()); String startime = DateUtil.sdfLongTimePlus_s.format(calendar.getTime()); String endtime = DateUtil.sdfLongTimePlus_s .format(upcalendar.getTime()); System.out.println(endtime); System.out.println(startime); // 测试时间 // // String startime = "20130617000000"; // String endtime = "20130617235959"; //从配置文件中获取 签名字符串不正确.. 后续找找原因. 原因已经找到 ,配置文件中的value值多了空格。。 // 人民币账号 // 本参数用来指定接收款项的快钱用户的人民币账号 String merchantAcctId =param.getString("merchantAcctId");// "1001213884201"; // 客户编号所对应的密钥。。在账户邮箱中获取 String key = param.getString("key");// "5UHQX2G65W4ECF5G"; // 字符集 固定值:1 1代表UTF-8 String inputCharsqet =param.getString("inputCharset");// "1"; // 查询接口版本 固定值:v2.0注意为小写字母 String versqion = param.getString("version");// "v2.0"; // 签名类型 固定值:1 1代表MD5加密签名方式 String signType =param.getString("signType");// "1"; // 查询模式 固定值:1 1代表简单查询(返回基本订单信息) String queryMode =param.getString("queryMode");// "1"; // 请求记录集页码 在查询结果数据总量很大时,快钱会将支付结果分多次返回。本参数表示商户需要得到的记录集页码。 // 默认为1,表示第1页。 String requestPage =param.getString("requestPage");//"1"; GatewayOrderQueryRequest rsq = new GatewayOrderQueryRequest(); rsq.setInputCharset(inputCharsqet); rsq.setVersion(versqion); rsq.setSignType(Integer.valueOf(signType)); rsq.setMerchantAcctId(merchantAcctId); rsq.setQueryType(1); rsq.setQueryMode(Integer.valueOf(queryMode)); rsq.setStartTime(startime); rsq.setEndTime(endtime); rsq.setRequestPage(requestPage); // 组合字符串。。必须按照此顺序组串 String signMsgVal = ""; signMsgVal = quaiqianorderquery.AppendParam(signMsgVal, "inputCharset", inputCharsqet); signMsgVal = quaiqianorderquery.AppendParam(signMsgVal, "version", versqion); signMsgVal = quaiqianorderquery.AppendParam(signMsgVal, "signType", signType); signMsgVal = quaiqianorderquery.AppendParam(signMsgVal, "merchantAcctId", merchantAcctId); signMsgVal = quaiqianorderquery.AppendParam(signMsgVal, "queryType", "1"); signMsgVal = quaiqianorderquery.AppendParam(signMsgVal, "queryMode", queryMode); signMsgVal = quaiqianorderquery.AppendParam(signMsgVal, "startTime", startime); signMsgVal = quaiqianorderquery.AppendParam(signMsgVal, "endTime", endtime); signMsgVal = quaiqianorderquery.AppendParam(signMsgVal, "requestPage", requestPage); signMsgVal = quaiqianorderquery.AppendParam(signMsgVal, "orderId", ""); signMsgVal = quaiqianorderquery.AppendParam(signMsgVal, "key", key); // 默认singtype=1 即按照md5 方式加密 String signMsg = MD5Util.md5Hex(signMsgVal.getBytes()).toUpperCase(); rsq.setSignMsg(signMsg); GatewayOrderQueryServiceLocator locator = new GatewayOrderQueryServiceLocator(); GatewayOrderQuery gservice = null; GatewayOrderQueryResponse queryResponse = null; try { gservice = locator.getgatewayOrderQuery(); queryResponse = gservice.gatewayOrderQuery(rsq); } catch (RemoteException e1) { System.out.println("获取locator对象失败。。"); e1.printStackTrace(); } catch (ServiceException e1) { System.out.println("获取locator对象失败。。"); e1.printStackTrace(); } if (queryResponse.getErrCode().equals(quaiqianorderquery.accountError)) { setErrormess("该账号不存在或已注销"); } if (queryResponse.getErrCode().equals(quaiqianorderquery.charsetError)) { setErrormess("字符集输入不正确"); } if (queryResponse.getErrCode().equals( quaiqianorderquery.currentPageNotExistError)) { setErrormess("当前记录的页码不存在"); } if (queryResponse.getErrCode().equals(quaiqianorderquery.endTimeError)) { setErrormess("查询结束时间不正确"); } if (queryResponse.getErrCode().equals( quaiqianorderquery.merchantAcctIdError)) { setErrormess("人民币账号格式不正确"); } if (queryResponse.getErrCode().equals( quaiqianorderquery.orderForPayNotSuccessError)) { setErrormess("订单号对应的交易未成功"); } if (queryResponse.getErrCode().equals(quaiqianorderquery.orderId)) { setErrormess("商户订单号格式不正确"); } if (queryResponse.getErrCode().equals( quaiqianorderquery.orderNotExistError)) { setErrormess("商户订单号不存在"); } if (queryResponse.getErrCode().equals( quaiqianorderquery.queryEndTimeGtTodayTime)) { setErrormess("查询结束时间晚于当前时间"); } if (queryResponse.getErrCode().equals( quaiqianorderquery.queryExceptionError)) { setErrormess("查询过程异常,请稍后再试"); } if (queryResponse.getErrCode() .equals(quaiqianorderquery.queryModeError)) { setErrormess("查询模式不正确或不存在"); } if (queryResponse.getErrCode().equals( quaiqianorderquery.queryResultGtfileScopeError)) { setErrormess("查询结果超出能允许的文件范围"); } if (queryResponse.getErrCode().equals( quaiqianorderquery.queryStartLtEndTimeError)) { setErrormess("开始时间不能再结束时间之后"); } if (queryResponse.getErrCode().equals(quaiqianorderquery.singTypeError)) { setErrormess("签名类型不正确或不存在"); } if (queryResponse.getErrCode() .equals(quaiqianorderquery.startTimeError)) { setErrormess("查询开始时间不正确"); } if (queryResponse.getErrCode().equals(quaiqianorderquery.systemBusy)) { setErrormess("系统忙,请稍后再试"); } if (queryResponse.getErrCode().equals( quaiqianorderquery.timeInnerNotDateError)) { setErrormess("本段时间内无交易记录"); } if (queryResponse.getErrCode().equals( quaiqianorderquery.timeInnerNotSuccessDateError)) { setErrormess("本段时间内无成功交易记录"); } if (queryResponse.getErrCode().equals(quaiqianorderquery.unKnownError)) { setErrormess("未知错误"); } if (queryResponse.getErrCode().equals(quaiqianorderquery.versionError)) { setErrormess("网关版本号不正确或不存在"); } if (queryResponse.getErrCode().equals( quaiqianorderquery.queryTimeOnlyIsThirtyDaysError)) { setErrormess("允许查询的时间最长为30天"); } if (queryResponse.getErrCode() .equals(quaiqianorderquery.queryTypeError)) { setErrormess("查询方式不正确或不存在"); } if (queryResponse.getErrCode().equals(quaiqianorderquery.singMsgError)) { setErrormess("签名字符串不匹配"); } if (queryResponse.getErrCode().equals( quaiqianorderquery.singMsgPowerError)) { setErrormess("签名字符串不匹配,你无权查询"); } if (!queryResponse.getErrCode().equals("")) { System.out.println("查找快钱订单数据出错..错误信息 " + getErrormess()); } else { System.out.println("查找每一天的快钱订单开始。。"); java.util.List<GatewayOrderDetail> lg = query.getQuaiQianOrders( rsq, queryResponse, gservice); System.out.println("执行入库操作开始。。。"); QuaiqianOrders qo = null; for (int i = 0; i < lg.size(); i++) { qo = new QuaiqianOrders(); GatewayOrderDetail g = lg.get(i); qo.setDealId(g.getDealId()); try { qo.setDealTime(DateUtil.fromStringToDate("yyyyMMddHHmmss",g.getDealTime())); qo.setOrderTime(DateUtil.fromStringToDate("yyyyMMddHHmmss",g.getDealTime())); } catch (ParseException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } qo.setFee(g.getFee()/100); qo.setOrderAmount(g.getOrderAmount()/100); qo.setOrderId(g.getOrderId()); qo.setOrdernum(0); qo.setPayType(g.getPayType()); qo.setPayAmount(g.getPayAmount()/100); try { query.insertQuaiqianDate(qo); } catch (SQLException e) { System.out.println("插入数据失败。。"); e.printStackTrace(); } } } System.out.println("开始执行当天数据的入库end。。。"); } }
2. 配置applicationContext-timer_task.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" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd"> <!-- 要调用的工作类 --> <bean id="kuaiqianJob" class="com.rc.portal.webapp.util.KuaiqianTask"> <property name="quaiqianorderquery" ref="quaiqianorderquery"></property> <property name="query" ref="quaiqianorderquerydao"></property> </bean> <!-- 定义调用对象和调用对象的方法 --> <bean id="jobtask" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> <!-- 调用的类 --> <property name="targetObject"> <ref bean="kuaiqianJob"/> </property> <!-- 调用类中的方法 --> <property name="targetMethod"> <value>run</value> </property> </bean> <!-- 定义触发时间 --> <bean id="doTime" class="org.springframework.scheduling.quartz.CronTriggerBean"> <property name="jobDetail"> <ref bean="jobtask"/> </property> <!-- cron表达式 --> <property name="cronExpression"> <value>0 0 0 * * ?</value> </property> </bean> <!-- 总管理类 如果将lazy-init='false'那么容器启动就会执行调度程序 java timer是如果过了时间会执行一次 spring不会 --> <bean id="startQuertz" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <property name="triggers"> <list> <ref bean="doTime"/> </list> </property> </bean> </beans>
3. web.xml 中记得加载这个sping文件
<context-param> <param-name>contextConfigLocation</param-name> <param-value> /WEB-INF/classes/applicationContext-*.xml </param-value> </context-param> <listener> <listener-class> org.springframework.web.context.ContextLoaderListener </listener-class> </listener>
现在由于某些原因 定时到达后执行两次任务 后续给上解决方案和原因。。。
相关文章推荐
- Spring定时任务实现方式总结
- Android 定时任务刷新的多种实现方式
- Spring定时调度任务实现方式
- Java实现定时任务的3种方式
- spring2实现定时任务的一种方式
- spring实现定时任务的两种方式之Spring 3整合Quartz 2实现定时任务
- Spring定时任务的实现方式--Spring Task
- php自动刷新与关闭页面后继续执行,定时任务的实现方式
- Android 定时任务的多种实现方式
- Quartz定时任务(纯java方式实现)
- java实现定时任务几种方式
- 定时任务的几种实现方式
- 定时任务的实现方式
- Spring + quartz 注解的方式实现定时任务
- android 定时任务的几种实现方式
- spring 定时任务(quartz方式实现)
- Spring定时任务的实现方式--ScheduledExecutorService
- 【Java】定时任务的几种实现方式
- spring用Scheduled注解方式实现定时任务
- Spring定时任务的实现方式