监听器的使用例子 ServletContextListener

之前一直对监听知识有个概念,最近业务需要用到了才真正有点了解了监听器的好处。

 

web项目的监听事件与监听器:

ServletAPI中的6个事件类:
ServletContextEvent:该类表示上下文(ServletContext)事件,当应用上下文对象发生变化,如创建或销毁上下文对象时,将触发上下文事件
ServletContextAttributeEvent:该类表示上下文(ServletContext)属性事件,当应用上下文属性改变,例如增加、删除、覆盖上下文中的属性时,将触发上下文属性事件
ServletRequestEvent:该类表示请求(ServletRequest)事件,当请求对象发生改变,例如创建或者销毁请求对象,将触发此事件
ServletRequestAttributeEvent:该类表示请求(ServletRequest)属性事件,当请求中的属性发生改变,触发该事件
HttpSessionEvent:该类表示会话(HttpSession)事件,当会话对象发生改变,例如创建或者销毁会话对象,活化或者钝化会话对象,将触发此事件
HttpSessionBindingEvent:该类表示会话(HttpSession)绑定事件,当会话中的属性发生变化,例如增加删除覆盖会话中

Servlet API针对每种事件类型,都定义了至少一种借口来处理该事件,这些接口都以Listener结尾,成为监听器接口,共有如下8种接口。
ServletConetxListener:上下文监听器,监听ServletContextEvent事件
ServletContextaAttributeListener:上下文属性监听器,用来监听ServletRequestAttributeEvent事件
ServletRequestListener:请求监听器,监听ServletRequestEvent事件。
ServletRequestAttributeListener:请求属性监听器,用来监听ServletRequestAttributeEvent事件
HttpSessionListener:会话监听器,监听HttpSessionEvent事件
HttpSessionActivationListener:会话活化监听器,监听HttpSessionEvent事件
HttpSessionAttributeListener:会话属性监听器,监听HttpSessionBindingEvent事件
HttpSessionBindingListener:会话绑定监听器,监听HttpSessionBindingEvent事件。

我这里是要求定时任务,我不知道如何让他实现程序开始自动启动。刚开始使用的是java程序。然后发现java程序不会定时,百度发现使用web程序,容器启动后让容器自动调用即可。

这个时候看到了别人写法使用了监听器,豁然开朗,于是也使用ServletContextListener实现了定时任务的功能:

public class AliRepayHistoryTask {


    public void task(){
        Timer timer = new Timer();
        TimerTask timerTask = new TimerTask() {
            @Override
            public void run() {
                fetchAliRepayHistory();
            }
        };
        timer.schedule(timerTask, new Date(2017 - 1900, 7, 14, 14, 2), 60*60*24);
    }

    public void fetchAliRepayHistory(){
        JdbcUtil jdbcUtil = new JdbcUtil();
        String sql = " select bill_seq_no , to_char(to_date(last_update_date, 'yyyyMMddHH24miss'), 'yyyy-MM-dd HH24:mi:ss')  " +
                " from acl.pay_order " +
                " where " +
                "     status = 'S' " +
                "     and gate_id = '1003' " +
                "     and last_update_date >= ? " +
                "     and last_update_date <= ? " +
                " order by last_update_date asc";

        String yesterday = DateUtil.getDateString(DateUtil.addDay(new Date(), -1), "yyyyMMdd");
        String yesterdayBegin = yesterday + "000000";
        String yesterdayEnd = yesterday + "235959";
        Object[] params = new Object[]{yesterdayBegin, yesterdayEnd};
        List<Order> orders = jdbcUtil.query(sql, params, new ResultHandler<List<Order>>() {
            public List<Order> handler(ResultSet rs) throws SQLException {
                List<Order> list = new ArrayList<Order>();
                while(rs.next()){
                    Order order = new Order();
                    order.setBillSeqNo((String)rs.getObject(1));
                    order.setCreateDate((String)rs.getObject(2));
                    list.add(order);
                }
                return list;
            }
        });
        try {
            FileOutputStream outputStream = new FileOutputStream(new File("C:/Users/zhen/Desktop/每日支付宝付款报表.txt"), true);
            BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter((outputStream)));
            bufferedWriter.newLine();
            bufferedWriter.write(yesterday.substring(0, 4) + "-" + yesterday.substring(4, 6) + "-" + yesterday.substring(6, 8) + ":");
            bufferedWriter.newLine();
            for(Order order : orders){
                bufferedWriter.write("billSeqNo=" + order.getBillSeqNo() + ", createDate=" + order.getCreateDate());
                bufferedWriter.newLine();
            }
            bufferedWriter.close();
            outputStream.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }


}



public class AliRepayHistoryTaskListener implements ServletContextListener{
    public void contextInitialized(ServletContextEvent servletContextEvent) {
        new AliRepayHistoryTask().task();
    }

    public void contextDestroyed(ServletContextEvent servletContextEvent) {

    }
}


    <listener>
        <listener-class>com.listener.AliRepayHistoryTaskListener</listener-class>
    </listener>
View Code

 

参考链接:http://blog.csdn.net/l1028386804/article/details/52727297

 

posted @ 2017-08-14 14:38  guodaxia  阅读(199)  评论(0编辑  收藏  举报