㈠ javaweb,监听器和定时器(Quartz)互相调控的问题
不明白你为什么要这样设计程序
通常情况下监听器只是用来启动定时器,剩下的工作都是让定时器去处理
因为你想,你的定时器怎么启动起来的?
肯定是交给监听器去启动,例如servlet监听器,servlet容器一创建就执行,也就是服务器一启动就执行,这个时候你在监听器里开启一个定时器就做事就行了
接下来就是让你的定时器去定时 定时5秒去查询表A有没有数据如果有就处理就行了
定时器本身就是定时执行,因此不需要延时启动了
纯手工打字的,请采纳哈
㈡ 在Java中如何设置一个定时任务,在每天的一个时间点自动执行一个特定的程序具体代码怎么写代码全点
Quartz定时机制
首先导入jar包到程序内 quartz-all-1.6.0.jar
然后创建一个XML
TimeConfig.xml 名字可以自己定义
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
"http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean id="mainTask" class="net.timed.MainTask"/> //你要执行的任务类
//jar类
<bean id="mainJob" class="org.springframework.scheling.quartz.">
<property name="targetObject">
<ref bean="mainTask"/>//将你的类添加到定时器当中
</property>
<property name="targetMethod">
<value>execute</value> //定时执行类里面的哪个方法
</property>
</bean>
<bean id="timeTrigger" class="org.springframework.scheling.quartz.CronTriggerBean">
<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 0/5 * * * ?</value> //定时的语法
</property>
</bean>
<bean id="sfb" class="org.springframework.scheling.quartz.SchelerFactoryBean">
<property name="triggers">
<list>
<ref local="timeTrigger"/>
</list>
</property>
</bean>
</beans>
//下面这个类就是我在XML中引入的类
package net.timed;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class MainTask {
public void execute() throws IOException
{
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println("do my job"+dateFormat.format(new Date()));
Runtime.getRuntime().exec("cmd /c start E:/mbl/BusinessOffice/MoneDB/bin/bakup.bat");
}
}
然后在web.xml中把这个TimeConfig.xml添加进去作为监听
系统启动的时候自动就监听这个事件
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<context-param>
<param-name>
contextConfigLocation
</param-name>
<param-value>
/WEB-INF/TimerConfig.xml
</param-value>
</context-param>
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
这个是quartz spring的定时机制 请仔细的看看 如果可以请给分哦
㈢ 定时器(quartz 一)
优点:与spring集成、动态添加任务、支持集群
缺点:不支持分布式(只能一个任务在一台服务器上执行,不能分片)
将一个任务拆分成多个独立的任务项,由分布式的服务器分别执行某一个或几个分片项。而传统的定时器任务都在一台服务器上执行,如果数据很大那么压力很大。
举例:处理一百万的订单:A服务器处理尾数偶数的订单,B服务器处理尾数奇数的订单。
整合java项目
1、引入quartz 依赖
2、quartz.properties
3、
注意:
1、每一个job执行都是一个新的线程(即使是同一个任务,这个elastic-job不同)但是如果在配置文件quartz.properties中配置的线程消耗完,也还是会陷入阻塞的。根据业务来预估线程池的大小。(所以的任务共享一个线程池)
2、每一个job执行都会创建一个新的job对象,所以想通过job的成员变量来传递信息是不可行的(每次都会初始化)
3、myJob类必须要有空的构造方法
1、方式1:在创建jobDetail是传递JobDataMap,然后通过JobExecutionContext获取JobDataMap
2、方式2:在myjob中定义成员变量,并生成get,set方法
上面我们知道任务间都是并发处理的,那么要考虑并发安全问题。
1、使用@DisallowConcurrentExecution
使用@PersistJobDataAfterExecution注解和jobDataMap.put方法
1、startTime属性:设置trigger第一次触发的时间
2、endTime属性:表示trigger的失效时间点
3、优先级(priority)当多个Trigger并发执行,但是线程不够时触发,会优先执行级别高的Trigger
TriggerBuilder.newTrigger().withPriority(10);
默认时5,数字越大优先级越高
4、错过触发(misfire instructions)
1、策略:错过了什么都不做,等待下一次触发时间
设置每5秒执行一次,任务7秒。
发现这样是不会生效的,因为内部判断了一下错过的时间是否大于misfireThreshold这个值(默认5秒),如果小于还是立即执行。这里我们只失效了2秒,是小于5秒的。
通过quartz.properties设置misfireThreshold的值
这样再运行,发现策略生效了。
2、策略:错过立即执行
5、日历(calendar)
1、可以在具体的时间点执行一次
2、可以按照指定间隔时间重复若干次
1、使用cron表达式触发
, 代表并且,如果10,20 10秒和20秒都指向
? 只能出现在日期和星期内,代表没有特定的值。如果使用*号日期了星期会有歧义,这是使用?
L 只能出现在日期和星期内,表示月的最后一天,或者星期六
W 只能出现在日期内,表示最接近这个日期的工作日
㈣ 如何监控java quartz定时器中的所有定时任务
你好:
监控用
org.quartz.Scheler
//TriggerState:-1表示不存在,0表示正在运行,1表示暂停中
inttriggerState=scheler.getTriggerState(trigger.getTriggerName(),trigger.getTriggerGroup());
//启动版
scheler.scheleJob
//暂停
scheler.pauseTrigger
//移除
scheler.unscheleJob
具体的权查一下API吧
㈤ 怎样用java做个定时器,每个星期一中午12点整执行doXX这一动作。越详细越好.用监听哥跪谢!
主类:
package tiwen4; import java.util.Calendar; import java.util.Timer; public class quartz { public static void main(String[] args) { try{ Calendar cal = Calendar.getInstance();//设置定时时间 cal.add(Calendar.DATE, 0);//表示从今天的12点开始跑起来,如果当前时间超过12点会马上跑一次,否则等12点再跑第一次 cal.set(Calendar.HOUR_OF_DAY, 12);//24小时制的,12就是中午12点 cal.set(Calendar.MINUTE, 0);//分 cal.set(Calendar.SECOND, 0);//秒 Timer processTimer = new Timer(); processTimer.scheleAtFixedRate(new ProcessClass(), cal.getTime(), 86400000);//86400000是24小时,即24小时跑一次 }catch(Exception e){ e.printStackTrace(); }finally{ } } }
定时器调用的类--我在这里只是输出了一下~你也可以自己加函数:
package tiwen4; import java.util.TimerTask; public class ProcessClass extends TimerTask { @Override public void run() { // TODO Auto-generated method stub System.out.println("输出了哈哈");// } }
我上面用的只是一种方式,其实定时方式有很多的linux和window都有自带的定时器,可以直接调用,也可以用上面所说的quartz包带的框架等等
㈥ Java定时器Java定时器怎么实现一个任务多个时间点,给别人用时间可以改动的
java中quartz框架设置定时任务时,是可以设置各种时间启动的
每天什么时候执行:
<value>0 59 23 * * ?</value>: 如下为每天23:59:00开始回执行
<value>0 1,2,3 11,12 * * ? </value>: 每天11:01,11:02,11:03; 12:01,12:02,12:03分执答行任务
至于你说的别人可以改时间,你可以把这个时间参数提取处理,放到一个页面或者数据库存起来,然后别人通过页面或者链接数据库修改就行了。