系统自动每周六凌晨2:00检查数据【希望高手指点】
--主要是检查数据库中有没有超过6个月没下订单的用户:如果发现有则改变其状态为:1 默认为:0--Times类用来判断今天是星期6凌晨2点
public class Times extends TimerTask{
@Override
public void run() {
try {
Date date=new Date();
if(date.getDay()==6 && date.getHours()==2){//判断是不是:星期6凌晨2点
String a="1";//标记
Date dates=new Date(this.scheduledExecutionTime());
Session session=HibernateSessionFactory.getSession();
//判断数据库里面有没有超过6个月没下订单的数据
//有的话改变状态为a
Query up=session.createQuery("update CstLost set lstStatus=:zhuangtai " +
"where lstLastOrderDate<getdate()-180")
.setString("zhuangtai", a);
int a1=up.executeUpdate();
session.beginTransaction().commit();
session.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
-----利用监听器开启服务执行Times类中的代码,然后在
如下:
public class Lister implements HttpSessionListener{
public void sessionCreated(HttpSessionEvent arg0) {
Timer time=new Timer();
TimerTask task=new Times();
time.schedule(task, 500L,100000L);//设置时间100000 为:100执行一次
}
-----------------但是我觉得这样太耗内存了,因为没100秒就去执行这个监听器,请问各位大大
有没有更好的方法去实现!!!项目用的是SSH
--------------------编程问答-------------------- 可以使用spring提供的类进行
具体参考:http://jakemanse.blog.51cto.com/1198141/294224 --------------------编程问答-------------------- 用 Quartz --------------------编程问答-------------------- 如果想用第三方jar,可以用楼上的,或者直接用Quartz。都很好用。
如果就用java.util.Timer的话,你不用一直运行的。你这样试试
new Timer(true),守护线程。
然后开始判断离最近的周6凌晨2点的时间Date,或者时间间隔 long. 然后调用
void
scheduleAtFixedRate(TimerTask task, Date firstTime, long period)
安排指定的任务在指定的时间开始进行重复的固定速率执行。
void
scheduleAtFixedRate(TimerTask task, long delay, long period)
安排指定的任务在指定的延迟后开始进行重复的固定速率执行。
方法
也就是第二个参数就确定了。
然后第三个参数是每次执行的间隔,也就是每个星期7*24*3600*1000。 --------------------编程问答-------------------- 数据库 存储过程 --------------------编程问答-------------------- 还请说详细点,给点思路~ --------------------编程问答-------------------- 用 Quartz ,配置一下,蛮好用的额 --------------------编程问答--------------------
+1 --------------------编程问答-------------------- 使用Quartz 挺好用得 现在给你一个例子:
第一步: 配置XML文件
<!-- 与quartz有关的设置 -->
<bean id="taoBaoJob" class="com.igobb.synch.tb.TbSynchService" />
<bean id="taoBaoTask"
class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject">
<ref bean="taoBaoJob" /><!-- 调用的Job类 -->
</property>
<property name="targetMethod">
<value>executeUpdateNum</value><!-- 调用的类中的方法 -->
</property>
</bean>
<bean id="taoBaoTime"
class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail">
<ref bean="taoBaoTask" />
</property>
<property name="cronExpression">
<value>0 0/10 * * * ?</value>
</property>
</bean>
<!-- 总管理类,如果lazy-init='false',则容器启动时就会执行调度程序-->
<!-- 如果lazy-init='true',则需要实例化该bean才能执行调度程序 -->
<bean id="billStartQuartz" lazy-init="false"
class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="taoBaoTime" />
</list>
</property>
</bean>
第二布:
在com.igobb.synch.tb.TbSynchService 这个类中 写方法:targetMethod :executeUpdateNum
即可。
然后写一个运行类:
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class App
{
public static void main( String[] args ) throws Exception
{
new ClassPathXmlApplicationContext("schedule-context.xml");
}
}
试试就ok了。
完成 --------------------编程问答-------------------- 用Spring的自动调度 来做 在配置文件里面配置一下调用查询方法
再写个方法调用数据库中的存储过程查询出来就行了 --------------------编程问答-------------------- 用的什么数据库? oracle的话可以写个定时任务 把这个功能交给数据库完成 可以减少服务器压力!
补充:Java , Web 开发