(个人笔记)java 定时执行

项目需求是这样的,有0000--9999个订单号,每一天,都要从0000开始。

现在有两张表,一张是systemset表,里面保存当前最大的订单号, 一张是订单详情表,字段有 日期、时间、订单号 等等。

客户端会从服务器端取订单号,也就是将systemset表中的订单号 + 1 返回给客户端,然后将最新值保存到表中,确保客户端得到不同的订单号。

问题是,要自动初始化systemset表中的订单号。使每天客户端获得的第一个订单好都是从0001开始的。


解决的方法是,写一个监听器,还有定时执行初始化操作的类,将该类放到监听器中,在服务器启动时加载该方法。

关于项目启动加载,请参考http://blog.csdn.net/mchange/article/details/8815679


下面是定时操作类,有参考

public class InitDealNoTimerTask {
	//间隔运行时间,24小时
	private static final long PERIOD_DAY = 24 * 60 * 60 * 1000;
	
	public InitDealNoTimerTask(){
		
		Calendar c = Calendar.getInstance();
		c.set(Calendar.HOUR_OF_DAY,0);
		c.set(Calendar.MINUTE, 0);
		c.set(Calendar.SECOND, 1);
		
		//该执行的时间
		Date doDate = c.getTime();
		
		//如果设定的执行时间点早于现在的时间
		//说明是重启过了,将日期加一天
		if(doDate.before(new Date())){
			
			doDate = addDay(doDate,1);
		}
		
		Timer timer = new Timer(true);
		TimerTask task = new TimerTask() {
			
			@Override
			public void run() {
				// 执行的方法,初始化订单号
				DataCURD.initDealNo();
			}
		};
		
		//安排指定的任务在指定的时间开始进行操作
		timer.schedule(task,doDate,PERIOD_DAY);
		System.out.println("加载周期初始化订单方法");
	}
	
	// +|- 天数
	public Date addDay(Date date, int num){
		Calendar startc = Calendar.getInstance();
		startc.setTime(date);
		startc.add(Calendar.DAY_OF_MONTH, num);
		return startc.getTime();
		
	}

}



这种方法适用于web服务器一直开启的情况,如果服务器在晚上10点关机,早上8点开启,那就绕过了初始化的方法了,咋办呢?


办法就是,在服务器启动加载的监听器中,加上

DataCURD.initDealNo(); //初始化订单
,在启动的时候,判断下。


初始化方法如下:

public static void initDealNo(){
		try{
			conn = DBUtil.getConnection();
			String date = "";
			String sql = "SELECT top 1 id,[Input_Ymd] FROM [pos_Data].[dbo].[WORKLIST] order by auto_no  desc";
			pstm = conn.prepareStatement(sql);
			
			rs = pstm.executeQuery();
			if(rs.next()){
				date = rs.getString("input_ymd");
				//如果今天的日期不等于最后交易的日期,就要初始化订单号
				if(!new SimpleDateFormat("yyyyMMdd").format(new Date()).equals(date)){
					String sql2 = "update [pos_Data].[dbo].[c_systemset] set p_code = '0000' where parameter='maxDealNo'";
					pstm  = conn.prepareStatement(sql2);
					pstm.executeUpdate();
					
					System.out.println("执行初始化订单方法");
				}
			}
			
			
		}catch(Exception e){
			e.printStackTrace();
		}finally{
			DBUtil.close(conn, rs, pstm);
		}
		
	}








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值