模块要求每天定时从一些表里查询信息,并插入到报表里
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();
}
这样就可以定时更新数据库内容了