【发布时间】:2013-01-08 10:33:45
【问题描述】:
我是 Web 开发的新手,我正在使用 java servlet 制作一些 Web 服务,但我被困在这么多 怎么办?东西:(
我正在开发一个应用程序,我需要在某个时间将 mysql 表列值重置为默认值,假设我们需要在每个星期日晚上 10:00 重置计数器。
有没有像Java或mysql中的警报管理器这样可以一直在后台运行并触发@特定时间的东西。
谢谢,
【问题讨论】:
我是 Web 开发的新手,我正在使用 java servlet 制作一些 Web 服务,但我被困在这么多 怎么办?东西:(
我正在开发一个应用程序,我需要在某个时间将 mysql 表列值重置为默认值,假设我们需要在每个星期日晚上 10:00 重置计数器。
有没有像Java或mysql中的警报管理器这样可以一直在后台运行并触发@特定时间的东西。
谢谢,
【问题讨论】:
Java有一个很好的接口ScheduledExecutorService。 你可以试试这个代码
ScheduledExecutorService service = Executors.newScheduledThreadPool(1);
//every day to execute
long everyDayDelay = 24*60*60*1000;
//first time to execute, it can be your special date
//for example 5 seconds after launch
long timeToExecute = System.currentTimeMillis()+5*1000;
service.scheduleWithFixedDelay(new Task(), getTimeToLaunch(timeToExecute), everyDayDelay, TimeUnit.MILLISECONDS);
在哪里
//return difference between now and timeToExecute
public static long getTimeToLaunch(long timeToExecute){
long current = System.currentTimeMillis();
return timeToExecute - current;
}
class Task implements Runnable{
@Override
public void run() {
System.out.println("Run task!");
}
}
更新:执行你的 sql 任务的类
public class SqlExecutionService1 {
public static final long everyDayDelay = 24*60*60*1000;
public SqlExecutionService1(){
ScheduledExecutorService service = Executors.newScheduledThreadPool(1);
//every day to execute
//first time to execute
//for example 5 seconds after launch
long timeToExecute = System.currentTimeMillis()+5*1000;
service.scheduleWithFixedDelay(new SqlTask1(), getTimeToLaunch(timeToExecute), everyDayDelay, TimeUnit.MILLISECONDS);
}
private long getTimeToLaunch(long timeToExecute){
long current = System.currentTimeMillis();
return timeToExecute - current;
}
}
class SqlTask1 implements Runnable{
@Override
public void run() {
//your sql tasks
}
}
要创建此类,请在您的应用服务器启动时 - 在您的一个主要 servlet 中使用方法 init()。 示例 -
public class MainInitServlet extends HttpServlet {
public void init() {
new SqlExecutionService1();
}
}
【讨论】:
数据库的数据应该是用于计算的基础,而不是计算的结果。例如,法案永远不会被成功修改。
我想这个事实将永远是程序员和架构师之间的冲突。
【讨论】:
你也可以使用mysql的事件调度机制
这取决于mysql的版本以及是否启用
【讨论】:
is there any thing like alarm manager in Java or mysql that can run all the time in background and trigger @ specific time.
查看一个名为 Quartz 的 API,您的程序可以在其中安排 Jobs 并且它将在那时运行它。
使用方法execute(JobExecutionContext jobExecution) 用于触发触发器。
EG:
SchedulerFactory schedulerFactory = new StdSchedulerFactory();
// Retrieve scheduler
Scheduler scheduler = null;
try {
scheduler = schedulerFactory.getScheduler();
}
catch (SchedulerException e) {
e.printStackTrace();
}
//this is a job
JobDetail job = new JobDetail("jobDetail", "jobDetailGroup", ImplementedJob.class);
SimpleTrigger trigger = new SimpleTrigger("Trigger Name","defaultGroup", DATE);
// schedule
scheduler.scheduleJob(job, trigger);
// start the scheduler
scheduler.start();
【讨论】: