功能介绍 当一个WAP网站加入WAP联盟之后,该网站必须在每天5点之前把从WAP联盟过来的访问量以及下载量发送给WAP联盟,以跟站长结算.
功能实现原理
在网站起一个定时任务,在每天的4点钟定时发送网站数据给WAP联盟,以便统计结算.
具体代码
网站是采用spring+structs+hibernate架构
在网站启动之前 必须运行定时任务,因此我们采用在WEB.XML中配置一个ServletContextListener方法,这样在网站启动之前,调用ServletContextListener的初始化方法来启动定时任务.
在web.xml中配置
<listener>
<listener-class>
TimerListener
</listener-class>
</listener>
TimerListener 的实现如下 它实现每隔一小时启动adverseTask 任务的功能
public class TimerListener implements ServletContextListener {
private java.util.Timer timer = null;
private AdverseTask adverseTask;
public void contextDestroyed(ServletContextEvent arg0) {
// TODO Auto-generated method stub
timer.cancel();
}
public void contextInitialized(ServletContextEvent arg0) {
// TODO Auto-generated method stub
timer = new java.util.Timer(true);
adverseTask = new AdverseTask(arg0.getServletContext());
timer.schedule(adverseTask, (long)0, (long)60 * 60 * 1000);
}
}
adverseTask 为一个定时任务,它主要实现在每天的四点定时统计前一天WAP联盟的访问量和下栽量,并通过HTTP协议发送给WAP联盟,它的实现如下
public class AdverseTask extends java.util.TimerTask{
private ServletContext context;
private static boolean isRunning = false;
private static boolean flag = true;
private static final int C_SCHEDULE_HOUR = 4;
private IAdverseInfo adverseinfo;
public void setAdverseinfo(IAdverseInfo info)
{
this.adverseinfo=info;
}
public IAdverseInfo getAdverseinfo()
{
return this.adverseinfo;
}
public AdverseTask()
{
}
public AdverseTask(ServletContext context)
{
this.context = context;
}
public void run()
{
Calendar cal = Calendar.getInstance();
if (!isRunning)
{
if (C_SCHEDULE_HOUR == cal.get(Calendar.HOUR_OF_DAY) && flag)
{
isRunning = true;
String path= context.getRealPath("/")+"WEB-INF"+"/";
List list=null;
ApplicationContext factory1 = new FileSystemXmlApplicationContext(path+"applicationContext.xml");//
adverseinfo=(IAdverseInfo)factory1.getBean("adverseinfotmpl");
try
{
list=this.adverseinfo.QueryAdverseInfo("4.0.0.0");
if((list!=null)&&(list.size()>0))
{
StringBuffer sb=new StringBuffer();
Iterator it=list.iterator();
AdveresinfoT info;
while(it.hasNext())
{
info=(AdveresinfoT)it.next();
String channelid="4.0.0.0";
String aid=String.valueOf(info.getAid());
String pid=String.valueOf(info.getPid());
String faid=String.valueOf(info.getFaid());
String fpid=String.valueOf(info.getFpid());
// Date date=info.getComedate();
StringBuffer date_str=new StringBuffer();
Calendar tempcal= Calendar.getInstance();
tempcal.add(Calendar.DATE, -1);
Date startdate = new Date(tempcal.getTime().getTime());
java.text.SimpleDateFormat sf =new java.text.SimpleDateFormat("yyyy-MM-dd");
String str_date=null;
str_date= sf.format(startdate);
int count=this.adverseinfo.QueryAdverseInfoByCondition(channelid, aid, pid, faid, fpid);//查询前天的统计量
int downtime=this.adverseinfo.QueryDownTimeByCondition(channelid, aid, pid, faid, fpid);//查询前天的下栽量
sb.append(aid);
sb.append(",");
sb.append(pid);
sb.append(",");
sb.append("0");
sb.append(",");
sb.append(count);
sb.append(",");
sb.append(downtime);
sb.append(",");
sb.append("0");
sb.append(",");
sb.append(str_date);
sb.append(",");
sb.append(faid);
sb.append(",");
sb.append(fpid);
sb.append("|");
}
URL url=null;
OutputStream out=null;
HttpURLConnection urlconnect=null;
InputStream in=null;
byte[] content=null;
content=sb.toString().getBytes();
System.out.println("content"+content);
try
{
url=new URL("http://sync.cn/sync");//WAP联盟的HTTP接口
urlconnect=(HttpURLConnection)url.openConnection();
urlconnect.setRequestMethod("POST");
urlconnect.setDoOutput(true);
urlconnect.setRequestProperty("Content-Type", "text/plain");
urlconnect.setRequestProperty("Content-Length", Integer
.toString(content.length));
out=urlconnect.getOutputStream();
out.write(content);
out.flush();//发送数据
System.out.println("request"+urlconnect.getResponseCode());//得到响应结果
in=urlconnect.getInputStream();//得到WAP联盟的应答数据
byte[] inputcontent=new byte[100];
String receive=null;
int length=-1;
while((length=in.read(inputcontent))!=-1)
{
receive+=new String(inputcontent,0,length);
}
System.out.println("receive"+receive);
}
catch(Exception e)
{
e.printStackTrace();
}
finally
{
try
{
if(urlconnect!=null)
{
urlconnect.disconnect();
}
if(out!=null)
{
out.close();
}
if(in!=null)
{
in.close();
}
}
catch( Exception e)
{
}
}
}
}
catch(DaoException e)
{
}
isRunning = false;
flag = false;
}
}
else
{
}
if(C_SCHEDULE_HOUR != cal.get(Calendar.HOUR_OF_DAY))
{
flag = true;
}
}
}