㈠ 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分執答行任務
至於你說的別人可以改時間,你可以把這個時間參數提取處理,放到一個頁面或者資料庫存起來,然後別人通過頁面或者鏈接資料庫修改就行了。