近日做的项目中有一个需求:web服务器端每日凌晨2点定时发送一个HTTP请求
我在网上查了一下,有人建议用spring的Quartz,这个虽然也能解决问题,但是spring是基于IOC容器的框架,我觉得就为了这一个小功能再搭建这个框架有点冗余了。
我还是决定做一个Listener监听器,最后把它用在项目上,效果并不差。具体代码如下:
1.监听类:SendTeamSaleData.java
/**
* 定时发送HTTP POST通讯
*/
public class SendTeamSaleData implements ServletContextListener {
Timer timer;
public void contextInitialized(ServletContextEvent sce) {
//时间间隔
long PERIOD_DAY = 24 * 60 * 60 * 1000;
Calendar calendar = Calendar.getInstance();
/*** 定制每日2:00执行方法 ***/
calendar.set(Calendar.HOUR_OF_DAY, 2);
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();
//设置任务计划,启动时间和间隔时间
//System.out.println(date.toString());
//安排指定的任务在指定的时间开始进行重复的固定延迟执行。
timer.schedule(new SendDataTasker(), date, PERIOD_DAY);
}
public void contextDestroyed(ServletContextEvent sce) {
timer.cancel();
}
// 增加或减少天数
public Date addDay(Date date, int num) {
Calendar startDT = Calendar.getInstance();
startDT.setTime(date);
startDT.add(Calendar.DAY_OF_MONTH, num);
return startDT.getTime();
}
}
2.任务类:SendDataTasker .java
public class SendDataTasker extends TimerTask{
@Override
public void run() {
System.out.println("开始执行定时发送HTTP通讯任务!!!!"+new Date());
//发送HTTP post通信
try {
SendXml.sendPost();
} catch (IOException e) {
e.printStackTrace();
}
}
}
3.发送HTTP通讯:SendXml.java
/**
* @功能 每天02:00发送报文
* @作者 Liker
*
*/
public class SendXml {
public static void sendPost() throws IOException{
String xml = "<?xml version=\"1.0\" encoding=\"GB2312\"?>" +
"" +
"senddata" +
"02:00:00" +
"1" +
"";
URL url;
BufferedReader reader = null;
try {
url = new URL("http://127.0.0.1:9008");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("POST");
conn.setDoOutput(true);
String strMessage ="";
StringBuffer buffer = new StringBuffer();
OutputStream output = conn.getOutputStream();
OutputStreamWriter out = new OutputStreamWriter(output,"UTF-8");
//System.out.println("xml:------"+xml.toString());
out.write(xml.toString());
out.flush();
out.close();
//接收返回数据
InputStream inputStream = conn.getInputStream();
reader = new BufferedReader(new InputStreamReader(inputStream,"UTF-8"));
while ((strMessage = reader.readLine()) != null) {
buffer.append(strMessage);
}
System.out.println("接收返回的结果:" + buffer);
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
if (reader != null) {
reader.close();
}
}
}
}
好了,最后再在web.xml里添加这个监听器:
com.liker.SendTeamSaleData
最后启动TOMCAT服务器,即可加载此定时任务。。