当前位置:编程学习 > JAVA >>

系统自动每周六凌晨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。 --------------------编程问答-------------------- 数据库 存储过程  --------------------编程问答-------------------- 还请说详细点,给点思路~
引用 4 楼 jiandan12214 的回复:
数据库 存储过程
--------------------编程问答-------------------- 用 Quartz ,配置一下,蛮好用的额 --------------------编程问答--------------------
引用 6 楼 cai5 的回复:
用 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 开发
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,