表中有一条数据
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);
}