JAVA定时任务。类似闹钟的业务

表中有一条数据
A字段 varchar 'Y' or 'N'开关
B字段 varchar (hh:mi:ss)
C字段 Integer
D字段 Integer
现在的业务要求是,服务器启动之后。根据A字段的开关,决定是否在每天的B字段时间执行求和C+D的方法

也就是说后台需要根据这条数据来实现该业务。请问如何实现。(该数据由前台维护。会对该条数据的字段进行随时修改。前台部分忽略)

各位大神可否说的详细些。万分感谢

如果有定义好的方法,规定了他所需的触发条件的话(如果没有规定,那你就规定),那你就拿着后台的这个得到的数据来作为规定条件,然后做几个判断,就可以实现了。
如解决请采纳

package com.sinosoft.test;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

public class TimerTest {

public static void main(String[] args) throws ParseException {
    String str1 = "2018-01-02 12:12:12";
    String str2 = "2018-01-02 12:12:09";
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    Date date1 = sdf.parse(str1);
    Date date2 = sdf.parse(str2);
    Calendar cal = Calendar.getInstance(); 
    long start = date1.getTime();
    long end = date2.getTime();
    long time=start-end;
    new Thread(new Runnable() {

        @Override
        public void run() {
            try {
                Thread.sleep(time);
                show();
                System.out.println("指定方法执行结束");
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

        }
    }).start();
    System.out.println("正常执行,"+time+"毫秒秒后执行指定方法");
}
public static void show(){
    System.out.println("指定的方法开始执行");
}

}

用Quarz 实现 很容易

使用quarz 前提是知道spring怎么使用 因为我这边是用spring集成配置的

<!-- //你要执行的任务类 -->


<!-- //jar类 -->


<!-- //将你的类添加到定时器当中 -->



<!-- //定时执行类里面的哪个方法 -->
execute

    </property>
</bean>
<bean id="timeTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
   <property name="jobDetail">
       <ref bean="mainJob"/>
    </property>
    <!-- 
    0 0 10,14,16 * * ? 每天上午10点,下午2点,4点
    0 0/30 9-17 * * ?   朝九晚五工作时间内每半小时
    0 0 12 ? * WED 表示每个星期三中午12点 
    "0 0 12 * * ?" 每天中午12点触发 
    "0 15 10 ? * *" 每天上午10:15触发 
    "0 15 10 * * ?" 每天上午10:15触发 
    "0 15 10 * * ? *" 每天上午10:15触发 
    "0 15 10 * * ? 2005" 2005年的每天上午10:15触发 
    "0 * 14 * * ?" 在每天下午2点到下午2:59期间的每1分钟触发 
    "0 0/5 14 * * ?" 在每天下午2点到下午2:55期间的每5分钟触发 
    "0 0/5 14,18 * * ?" 在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发 
    "0 0-5 14 * * ?" 在每天下午2点到下午2:05期间的每1分钟触发 
    "0 10,44 14 ? 3 WED" 每年三月的星期三的下午2:10和2:44触发 
    "0 15 10 ? * MON-FRI" 周一至周五的上午10:15触发 
    "0 15 10 15 * ?" 每月15日上午10:15触发 
    "0 15 10 L * ?" 每月最后一日的上午10:15触发 
    "0 15 10 ? * 6L" 每月的最后一个星期五上午10:15触发 
    "0 15 10 ? * 6L 2002-2005" 2002年至2005年的每月的最后一个星期五上午10:15触发 
    "0 15 10 ? * 6#3" 每月的第三个星期五上午10:15触发 
    上面这个是quartz的语法 定时单位
     -->
    <!--  //定时的语法 -->
        <property name="cronExpression">
            <value>0 15 10 ? * MON-FRI</value>  
        </property>
</bean>








----------------------------以上是quarz配置文件 看注释

下面是java 任务代码

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.beans.factory.annotation.Autowired;

import com.yangqiu.common.util.ExportUtil;
import com.yangqiu.common.util.TimeStampUtil;
import com.yangqiu.entity.LoanPerson;
import com.yangqiu.service.ILoanPersonService;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.Properties;

import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.*;
import javax.mail.internet.*;
public class MailJob implements Job
{
@Autowired
private ILoanPersonService loanService;

@Override
public void execute(JobExecutionContext context)
    throws JobExecutionException {
                //具体省略
}

}

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
"http://www.springframework.org/dtd/spring-beans.dtd">

<!-- //你要执行的任务类 -->


<!-- //jar类 -->


<!-- //将你的类添加到定时器当中 -->



<!-- //定时执行类里面的哪个方法 -->
execute

    </property>
</bean>
<bean id="timeTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
   <property name="jobDetail">
       <ref bean="mainJob"/>
    </property>
    <!-- 
    0 0 10,14,16 * * ? 每天上午10点,下午2点,4点
    0 0/30 9-17 * * ?   朝九晚五工作时间内每半小时
    0 0 12 ? * WED 表示每个星期三中午12点 
    "0 0 12 * * ?" 每天中午12点触发 
    "0 15 10 ? * *" 每天上午10:15触发 
    "0 15 10 * * ?" 每天上午10:15触发 
    "0 15 10 * * ? *" 每天上午10:15触发 
    "0 15 10 * * ? 2005" 2005年的每天上午10:15触发 
    "0 * 14 * * ?" 在每天下午2点到下午2:59期间的每1分钟触发 
    "0 0/5 14 * * ?" 在每天下午2点到下午2:55期间的每5分钟触发 
    "0 0/5 14,18 * * ?" 在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发 
    "0 0-5 14 * * ?" 在每天下午2点到下午2:05期间的每1分钟触发 
    "0 10,44 14 ? 3 WED" 每年三月的星期三的下午2:10和2:44触发 
    "0 15 10 ? * MON-FRI" 周一至周五的上午10:15触发 
    "0 15 10 15 * ?" 每月15日上午10:15触发 
    "0 15 10 L * ?" 每月最后一日的上午10:15触发 
    "0 15 10 ? * 6L" 每月的最后一个星期五上午10:15触发 
    "0 15 10 ? * 6L 2002-2005" 2002年至2005年的每月的最后一个星期五上午10:15触发 
    "0 15 10 ? * 6#3" 每月的第三个星期五上午10:15触发 
    上面这个是quartz的语法 定时单位
     -->
    <!--  //定时的语法 -->
        <property name="cronExpression">
            <value>0 15 10 ? * MON-FRI</value>  
        </property>
</bean>








说个设计思路吧,既然你的定时时间是存在表中的,而且修改时间是前端操作的,你的角色是后端,那么你需要做的是:
1、前端修改时间,并把时间传给后台,后台进行表修改。
2、表修改后,在同action中检查是否已经有闹钟的定时任务,有则停止并更新任务时间参数重启,时间参数从表中读取;没有则新建。

quartz可以实现定时任务,但是的需要一个线程去扫描表,扫表不要太快就行,然后线程动态把任务添加给quartz

网上有一个叫jeecg的快速开发平台,其社区有开源代码,其中【系统监控-->定时任务】这个功能跟你说的基本一样,你可以看一下这个平台http://demo.jeecg.org/loginController.do?login。
我之前有一个功能跟你说的差不多,就是参照这个代码来写的,使用了quartz。主要实现如下:
1、自己实现一些job类,执行任务。
2、实现一系列对定时任务表中数据的增、删、改、查。
3、当系统启动的时候从定时任务表查询,然后将job和创建的触发器发布(不知道是不是这个词)为任务。
4、进行增、删、改的时候,修改这个表数据的同时也需要对任务队列(不了解是不是这个说法)进行操作(比如删除了任务表数据,也需要删除任务队列里的这个任务)。

在ColunmA值被修改后执行以下

    final long period = 24 * 60 * 60 * 1000; //间隔时间 24 小时
        if(ColunmA = Y){
            String bTime = "13:36:50"; // 首次执行时间, 值来自 ColunmB
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd " + bTime);
            Date firstTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(sdf.format(new Date()));

            Timer t = new Timer();
            t.schedule(new TimerTask(){
                public void run() {
                    // ColunmC + ColunmD
                }
            }, firstTime, period);
        }