最近修改路透终端数据图表程序,由于时间太长,路透终端会踢断我们这边的部分请求链接,所以我们想出一种方案:
<一>启用一个特定功能的线程(继承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();
}
}
转载于:https://blog.51cto.com/alina64/1426996