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自动运行程序?的主要内容,如果未能解决你的问题,请参考以下文章