模块要求每天定时从一些表里查询信息,并插入到报表里


1.重写ContextLoaderListener类



首先重写ContextLoaderListener类,在contextInitialized中继承原来的,并加入自己需要启动时自动运行的业务。要注意的是,这里的meritRemindBo,birthRemindBo和BirthRemindThread用注入的方式得不到,得用以下的方式获取

public class ContextLoaderListenerOverWrite extends ContextLoaderListener {
	private IBirthRemindBo birthRemindBo;
	private IMeritRemindBo meritRemindBo;

	@Override
	/** 
	 * @description 重写ContextLoaderListener的contextInitialized方法 
	 */
	public void contextInitialized(ServletContextEvent event) {
		super.contextInitialized(event);
		ApplicationContext applicationContext = WebApplicationContextUtils
				.getWebApplicationContext(event.getServletContext());
		// 获取bean
		birthRemindBo = (IBirthRemindBo) applicationContext
				.getBean("birthRemindBo");
		meritRemindBo = (IMeritRemindBo) applicationContext
				.getBean("meritRemindBo");
		BirthRemindThread birthRemindThread = (BirthRemindThread) applicationContext
				.getBean("BirthRemindThread");
		birthRemindThread.setBirthRemindBoo(birthRemindBo);
		birthRemindThread.setMeritRemindBoo(meritRemindBo);
		birthRemindThread.start();

	}
}


2.修改配置



在web.xml中的配置也改成自己复写的。原本是org.springframework.context.ApplicationContext

<listener>
		<listener-class>com.scitel.sycrm.common.util.ContextLoaderListenerOverWrite</listener-class>
</listener>



3.业务方法



然后我的birthRemindThread是线程类,在run方法里写你的业务。这里的birthRemindBoo和meritRemindBoo依然使用spring的注入

public void run() {
		while (true) {
			System.out.println("thread..");
			try {

				// 当天生日(包括闰年)
				StringBuffer sql = new StringBuffer(
						"select d.donor_id,d.donor_name,d.donor_birth,d.birth_choice,di.mcontact_mobile from donor_info_atta d left join donor_info di on d.donor_id=di.donor_id  where to_char(d.donor_birth,'mm-dd') in (select to_char(sysdate,'mm-dd')from dual)");
				// System.out.println(sql);
				// 15天后生日
				StringBuffer sql1 = new StringBuffer(
						"select d.donor_id,d.donor_name,d.donor_birth,d.birth_choice,di.mcontact_mobile from donor_info_atta d left join donor_info di on d.donor_id=di.donor_id where to_char(d.donor_birth,'mm-dd') in (select to_char(sysdate+15,'mm-dd')from dual)");
				// System.out.println(sql1);
				// 供奉今日到期
				StringBuffer sql2 = new StringBuffer(
						"select s.seqID,s.merit_name,s.sacrifice_type,s.donor_id,s.donor_name,s.sacrifice_end_date,d.mcontact_mobile from sacrifice_info s left join donor_info d on s.donor_id=d.donor_id  where to_char(s.sacrifice_end_date,'yyyy-mm-dd') in (select to_char(sysdate,'yyyy-mm-dd')from dual) ");
				// 供奉还有3天到期
				StringBuffer sql3 = new StringBuffer(
						"select s.seqID,s.merit_name,s.sacrifice_type,s.donor_id,s.donor_name,s.sacrifice_end_date,d.mcontact_mobile from sacrifice_info s left join donor_info d on s.donor_id=d.donor_id  where to_char(s.sacrifice_end_date,'yyyy-mm-dd') in (select to_char(sysdate+3,'yyyy-mm-dd')from dual) ");

				birthRemindBoo.insertByTime(sql.toString());

				birthRemindBoo.insertByTime(sql1.toString());
meritRemindBoo
				meritRemindBoo.insertByTime(sql2.toString());
				meritRemindBoo.insertByTime(sql3.toString());

				sleep(24 * 60 * 60 * 1000);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}



这样就可以定时更新数据库内容了