项目需求是这样的,有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);
}
}