最近修改路透终端数据图表程序,由于时间太长,路透终端会踢断我们这边的部分请求链接,所以我们想出一种方案:

<一>启用一个特定功能的线程(继承Thread),不过在测试时发现内存溢出的问题

  1、 在总的入口类QSConsumer中增加public static boolean isTime=false;//true:到了断开所有连接的时刻啦

  2、在run()方法中,建立连接前,调用自己写的TimeWatcher类(该类主要实现了时间的对比,到了一定时间时,设定入口类QSConsumer的isTime值)

TimeWatcher timeWatcher=new TimeWatcher();

timeWatcher.start();

这里需要注意一点,是启动一个线程,不同的是,我们的线程是继承了Thread类的

TimerWatcher,实现了某些我们特定的功能。

3、TimerWather类的内容如下:

package com.ztcj.util;

import java.text.SimpleDateFormat;
import java.util.Date;

import org.apache.log4j.Logger;

import com.ztcj.reutes.login.QSConsumer;

public class TimeWatcher extends Thread {
    Logger _logger=Logger.getLogger(TimeWatcher.class.getName());
	@Override
    public void run() {
        super.run();
        try {
        	while(true)
            {
            	TimeCompare();
            }
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
        
    }

	/*
	 * 时间对比
	 */
	public void TimeCompare() throws Exception {
		SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMdd-HH:mm:ss");
		String time = formatter.format(new Date()).split("-")[1];
		if (time.equals("12:00:00"))// 如果时间为中午十二点
		{
			 _logger.info("断开全部连接。。。。");
			 
		QSConsumer.isTime=true;//等于某时间时,将QSConsumer中的isTime设置为true
			Thread.sleep(800);
		} 
	}
}

<二>每天定时执行任务

package com.ztcj.util;

import java.util.Calendar;
import java.util.Date;
import java.util.Timer;
/*
 * @Author:Alina
 * @DateTime:2014-6-16
 * @FUN:每天定时执行任务
 */

public class TimerManager {
	//时间间隔
	private static final long PERIOD_DAY=24*60*60*1000;
	public TimerManager()
	{
		Calendar calendar=Calendar.getInstance();
		/*
		 * 定制每日12:00 执行方法
		*/
		calendar.set(Calendar.HOUR_OF_DAY,12);
		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 timer=new Timer();
		DataTimerTask task=new DataTimerTask();
		//安排指定的任务在指定的时间开始进行重复的固定延迟执行
		timer.schedule(task, date,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点执行。为了,避免这种情况
发生,只能判断一下,如果发布或重启服务的时间晚于定时执行任务的时间,就在此基础上加一天。

package com.ztcj.util;

import java.util.TimerTask;

import org.apache.log4j.Logger;

import com.ztcj.reutes.login.QSConsumer;

public class DataTimerTask extends TimerTask{
	private static Logger log=Logger.getLogger(DataTimerTask.class);

	@Override
	public void run() {
		// TODO Auto-generated method stub
		try
		{
			QSConsumer.isTime=true;//等于某时间时,将QSConsumer中的_itemManager清空
		}
		catch(Exception e)
		{
			e.printStackTrace();
			log.info("DataTimerTask中设置将QSConsumer中的isTime失败");
		}
	}

}
在QSConsumer类的run()中如下去使用
public void run() {
	/*TimeWatcher timeWatcher=new TimeWatcher();
	timeWatcher.start();*/
	TimerManager timerManager=new TimerManager();
	while (true) 
	{			
	toConnect();			
	}
}