java如何在每一天的凌晨00:00:00自动运行程序?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java如何在每一天的凌晨00:00:00自动运行程序?相关的知识,希望对你有一定的参考价值。

LZ指的是定时任务吧
在java里面做定时任务通常是线程的
下面有个简单的定时任务(没验证是否好使 但基本是这个样子的)
在web.xml里面增加一个监听
<listener>
<listener-class>CountListen</listener-class>
</listener>
具体代码如下
import javax.servlet.ServletContextListener;
import javax.servlet.ServletContextEvent;
import java.util.*;

public class CountListen
implements ServletContextListener
private java.util.Timer timer = null;
public void contextInitialized(ServletContextEvent event)
timer = new java.util.Timer(true);
event.getServletContext().log("定时器已启动");
System.out.println("定时器已启动");
Date date = new Date(1900,1,1,23,59);
timer.schedule(new SampleTask(event.getServletContext()),0,
24 * 60 * 60 * 1000);
event.getServletContext().log("已经添加任务调度表");
System.out.println("已经添加任务调度表");


public void contextDestroyed(ServletContextEvent event)
timer.cancel();
event.getServletContext().log("定时器销毁");



import java.util.*;
import javax.servlet.ServletContext;
import com.founder.gongan.util.ConfigPropertie;
import com.founder.gongan.manage.CountManager;
import com.founder.botong.entity.EnumFolder;

class SampleTask
extends TimerTask
private static boolean isRunning = true;
private ServletContext context = null;
public SampleTask(ServletContext context)
this.context = context;


public void run()
if (isRunning)
isRunning = false;
context.log("开始执行指定任务");
System.out.println("开始执行指定任务");
//指定的任务......
isRunning = true;
context.log("指定任务执行结束");
System.out.println("指定任务执行结束");
else
context.log("上一次任务执行还未结束");



参考技术A 使用spring定时简单一些

1)需要的jar包为:quartz.jar包,将他加到你工程的classpath中去。
2)在applicationContext中配置你的定时操作。
(1)下边定义的这个testQuarz就是我们要将我们的定时操作函数TestDoIt()所要放置的地方。就是说TestDoIt()这个方法是 TestQuarz这个类中的一个函数。这里声明一下这个bean。就是将这个bean注入到我们的容器中。这个时候我们可以在这个bean中引用容器中其他的bean进行数据库操作。
代码:
<bean id="testQuarz" class="cn.demo.test.util.TestQuarz"/>

(2)下边的这个bean是我们定义要使用哪个bean中的哪个方法作为我们要定时执行的任务。这里定义了我们要使用testQuarz这个bean中的TestDoIt()这个函数作为我们要定时执行的任务。

代码:
<bean id="quartzDetail"
class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject">
<ref bean="testQuarz"/>
</property>
<property name="targetMethod">
<value>TestDoIt</value>
</property>
</bean>

(3)这是一个触发器的bean的设置,在这里我们设置了我们要触发的jobDetail是哪个。这里我们定义了要触发的jobDetail是quartzDetail,并且我们还定义了触发的时间。

代码:
<bean id="quartzTrigger"
class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail">
<ref bean="quartzDetail"/>
</property>
<property name="cronExpression">

<!-- 每天凌晨1点7分18妙运行定时任务,时间的设置请看下边
更多的配置例子请查看:http://wiki.opensymphony.com/display/QRTZ1/CronTriggers+Tutorial
-->

代码:
<value>18 7 1 * * ?</value>

</property>
</bean>

<!-- 一定要把autowire设置为no,否则它能感知出dataSourse并设置里面的dataSourse的属性-->
(4)下边的是我们管理这些触发器的总设置,他管理我们我们的触发器列表。据说他的内部是自己建立了自己的数据库来存放自己的临时表,因为我们在我们的配置文件中自动的配置了dataSource这个bean,我们的每一个bean都会在使用数据库的时候找到他,但是如果我们下边的这个管理bean知道的话就会把他当成自己的临时数据库,然后就会出错。所以我们需要将下边的数据库感知设置成否定。这样就不影响他内部实现了。我们可以在下边的bean的list中放置多个触发器。

代码:
<bean autowire="no" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref local="quartzTrigger"/>
</list>
</property>
</bean>

到此,我们的定时发送设置就完成了,具体的还要看看spring的refence比较好,那些比较细的细节东东我没有涉及到。
参考技术B 可以自己写一个线成

如何在 MySQL 中发现一个月中每一天的总和?

【中文标题】如何在 MySQL 中发现一个月中每一天的总和?【英文标题】:How to discover the sum of each day of a month in MySQL? 【发布时间】:2013-04-26 14:42:28 【问题描述】:

假设我们有一个表(例如sales),其中包含三个字段id(int,primary),price(double),date(datetime)。

我们怎样才能得到当月每一天的price属性的总和?

到最后一个月?

我也需要类似的退货:

二月

01        02        03        04        ...        30
101.1     233.43    1232.42  3232.21             121.23

四月

01        02        03        04        ...        30        31
11.1     23.43      122.42   332.21              121.23    2323.32

我们怎样才能做到这一点?

请给我一个SQL作为例子。

我想写一个方法来发现一个月的天数,而不是迭代地创建 SQL,但我认为这不是最好的方法。

【问题讨论】:

select sum(price) ... group by year(datefield), month(datefield), day(datefield) 您希望结果是水平的? @FreshPrinceOfSO,水平不是真的需要,谢谢通知。 【参考方案1】:

你实际上想要做一个支点:

select year(date), month(date),
       sum(case when day(date) = 1 then price end) as price_01,
       sum(case when day(date) = 2 then price end) as price_02,
       . . .
       sum(case when day(date) = 31 then price end) as price_31
from sales
group by month(date), year(date)

然后为您想要的日期添加一个where 子句。比如:

where month(date) = month(now())

【讨论】:

【参考方案2】:

收集所有想法(谢谢@MarcB、@Stephan、@GordonLinoff)SQL 波纹管是我正在寻找的:

二月

SELECT
    SUM(price) AS daySum
FROM
    sales
WHERE
    date BETWEEN DATE_FORMAT(NOW() - INTERVAL 2 MONTH,'%Y-%m-01 00:00:00') AND DATE_FORMAT(LAST_DAY(NOW() - INTERVAL 2 MONTH),'%Y-%m-%d 23:59:59')
GROUP BY
    YEAR(date),
    MONTH(date),
    DAY(date)

四月(我们目前是四月)

SELECT
    SUM(price) AS daySum
FROM
    sales
WHERE
    date BETWEEN DATE_FORMAT(NOW(),'%Y-%m-01 00:00:00') AND DATE_FORMAT(LAST_DAY(NOW()),'%Y-%m-%d 23:59:59')
GROUP BY
    YEAR(date),
    MONTH(date),
    DAY(date)

非常感谢。

【讨论】:

非常感谢!你知道如何做到这一点,即使对于没有订单的日期,它也会显示 0。现在它只会在结果中删除那一天并给出不一致的结果(有些日子会丢失)

以上是关于java如何在每一天的凌晨00:00:00自动运行程序?的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 获取数组中每一天的最新数组项

JAva数据库问题:数据库的time字段是datetime类型,如何查询某一天的数据?

java 如何设定时间执行程序

如何每隔一天自动获取 Unix 时间戳?

夏令时和 Cron

如何按日期分组,考虑时区和 DST?