Servlet的init方法在服务器启动时执行

        有时候希望在servlet首次载入时,执行复杂的初始化任务,但并不想每个请求都重复这些任务。用init()方法能实现在servlet初次创建时被调用,之后处理每个用户的请求时,则不再调用这个方法。因此,它主要用于一次性地初始化,和applet的init方法相同。

        比如,我启动Tomcat后,每当我本地的一张表里有条数据符合我设置的要求,我就想把它取出来进行处理。处理完成后,一直等待直到下一条符合我设置要求的数据出现:

public class Lostvoice extends HttpServlet{

	@Override
	public void init() throws ServletException {
		missphone();
	}
	
	private void missphone () {
		
		Runnable run = new Runnable() {
			public void run() {
				while (true) {
					SimpleDateFormat sdf = new SimpleDateFormat("yyyyMM");
					String date = sdf.format(new Date());
					String sql = "select sid, enterID ,caller,called,to_char(opertime,'yyyymmddhh24miss') from db_lost_msg_" + date
								+ " where state = 0 or state is null";
					try {
						Connection conn = ConnUtils.getConn();
						Statement stat = conn.createStatement();
						ResultSet rs = stat.executeQuery(sql);
						while(rs.next()) {
							String update = "update db_lost_msg_" + date + " set state = 1 where sid = '"+ rs.getString(1)	+ "'";
							System.out.println("开始更新sid为" + rs.getString(1) + "的数据状态为1");
							stat.executeUpdate(update);
							System.out.println("更新结束");
						}
						ConnUtils.close(conn, stat, rs);
					} catch (SQLException e) {
						e.printStackTrace();
					}
					try {
						Thread.sleep(3000);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
			}
		};
		
		Thread thread = new Thread(run);
		thread.start();
	}
}

如果要想让servlet的init()方法在服务器启动时就被执行,还需要在web.xml中相应的servlet下配置:

<servlet>
  	<servlet-name>lostvoice</servlet-name>
  	<servlet-class>com.servlet.Lostvoice</servlet-class>
  	<load-on-startup>1</load-on-startup>
  </servlet>
  
  <servlet-mapping>
  	<servlet-name>lostvoice</servlet-name>
  	<url-pattern>/lostvoice</url-pattern>
  </servlet-mapping>

即将:<load-on-startup>1</load-on-startup>设置为正整数(包括0)

这样此servlet就会在服务器启动时执行了。(注意:如果设置为负整数,则不会在启动服务器时执行!)

如果不配置,启动服务器时也不会执行,而要等此servlet被调用时才会被执行

猜你喜欢

转载自coyotestark.iteye.com/blog/2317535