❶ java中每個月第一天執行一次任務的定時器如何實現
Date d = new Date();//獲取伺服器的時間。。。
Calendar c= Canlendar.getInstance();
c.setTime(d);
if(c.get(Calendar.DAY_OF_MONTH) == 1) //當前是1號
{
//拿出黨員的入黨日期(年月)同當前月進行比較 如果相同 發送簡訊
// //寫下你的判斷代碼
}
else //當前不是1號 則從下個月1號開始執行定期任務
{
c.set(Calendar.MONTH,c.get(Calendar.MONTH)+ 1);//設置為下月
c.set(Calendar.DAY_OF_MONTH,1);//設置為下月的1號
Timer timer =new Timer();
timer.scheleAtFixedRate(new TimerTask()
{
public void run()
{
//每天都來判斷一下 如果當前日期是1號
////則拿出黨員的入黨日期(年月)同當前月進行比較 如果相同 發送簡訊
//run函數里寫下你的判斷代碼
}},c.getTime(),24* 3600*1000); //每天執行一次run()方法...
}
❷ java 定時任務的幾種實現方式
JDK 自帶的定時器實現
// schele(TimerTask task, long delay) 延遲 delay 毫秒 執行
// schele(TimerTask task, Date time) 特定時間執行
public static void main(String[] args) {
for (int i = 0; i < 10; ++i) {
new Timer("timer - " + i).schele(new TimerTask() {
@Override
public void run() {
println(Thread.currentThread().getName() + " run ");
}
}, 1000);
}
}
2. Quartz 定時器實現
//首先我們需要定義一個任務類,比如為MyJob02 ,
//該類需要繼承Job類,然後添加execute(JobExecutionContext context)方法,在
//這個方法中就是我們具體的任務執行的地方。
//由希望由調度程序執行的組件實現的介面
public class MyJob02 implements Job {
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
// TODO Auto-generated method stub
// 執行響應的任務.
System.out.println("HelloJob.execute,"+new Date());
}
}
public class QuartzTest5 {
public static void main(String[] args) throws Exception {
//SchelerFactory 是一個介面,用於Scheler的創建和管理
SchelerFactory factory = new StdSchelerFactory();
//從工廠裡面拿到一個scheler實例
//計劃表(可能翻譯的不太貼切),現在我們有了要做的內容,
//與調度程序交互的主要API
/*
* Scheler的生命期,從SchelerFactory創建它時開始,
到Scheler調用shutdown()方法時結束;Scheler被創建後,
可以增加、刪除和列舉Job和Trigger,以及執行其它與調度相關的操作
(如暫停Trigger)。但是,Scheler只有在調用start()方法後,
才會真正地觸發trigger(即執行job)
*/
Scheler scheler = factory.getScheler();
//具體任務.
//用於定義作業的實例
//JobBuilder - 用於定義/構建JobDetail實例,用於定義作業的實例。
JobDetail job = JobBuilder.newJob(MyJob.class).withIdentity("job1", "group1").build();
//Trigger(即觸發器) - 定義執行給定作業的計劃的組件
//TriggerBuilder - 用於定義/構建觸發器實例
CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger1", "group1")
.withSchele(CronScheleBuilder.cronSchele("0/1 * * * * ?")).build();
scheler.scheleJob(job, trigger);
scheler.start();
}
3. Spring boot 任務調度(這個非常容易實現)
/*
* 開啟對定時任務的支持
* 在相應的方法上添加@Scheled聲明需要執行的定時任務。
*/
@EnableScheling
//@EnableScheling註解來開啟對計劃任務的支持
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
@Component
public class ScheledTasks {
private Logger logger = LoggerFactory.getLogger(ScheledTasks.class);
private int i=0;
//0 0 0 2 * ?
@Scheled(cron="* * * 2 * ?")
//@Scheled 註解用於標注這個方法是一個定時任務的方法
public void testFixDelay() {
logger.info("執行方法"+i++);
}
❸ java的幾種定時任務
java定時任務有三種:
- JDK自帶 :JDK自帶的Timer以及JDK1.5+ 新增的ScheledExecutorService;
- Quartz :簡單卻強大的JAVA作業調度框架
- Spring3.0以後自帶的task :可以將它看成一個輕量級的Quartz,而且使用起來比Quartz簡單許多;
代碼參考:
JDK 自帶的定時器實現
schele(TimerTask task, Date time) 特定時間執行
public static void main(String[] args) {
for (int i = 0; i < 10; ++i) {
new Timer("timer - " + i).schele(new TimerTask() {
@Override
public void run() {
println(Thread.currentThread().getName() + " run ");
}
}, new Date(System.currentTimeMillis() + 2000));
}
}
Quartz 定時器實現
2.1 通過maven引入依賴(這里主要介紹2.3.0) 注意:shiro-scheler中依賴的是1.x版本 如果同時使用會沖突
<!-- https://mvnrepository.com/artifact/org.quartz-scheler/quartz -->
<dependency>
<groupId>org.quartz-scheler</groupId>
<artifactId>quartz</artifactId>
<version>2.3.0</version>
</dependency>
2.2創建Job類
public class TestJob implements Job{
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
println(Thread.currentThread().getName() + " test job begin " + DateUtil.getCurrentTimeStr());
}
}
2.3調度任務
public static void main(String[] args) throws InterruptedException, SchelerException {
Scheler scheler = new StdSchelerFactory().getScheler();
// 開始
scheler.start();
// job 唯一標識 test.test-1
JobKey jobKey = new JobKey("test" , "test-1");
JobDetail jobDetail = JobBuilder.newJob(TestJob.class).withIdentity(jobKey).build();
Trigger trigger = TriggerBuilder.newTrigger() .withIdentity("test" , "test")
// 延遲一秒執行
.startAt(new Date(System.currentTimeMillis() + 1000))
// 每隔一秒執行 並一直重復
.withSchele(SimpleScheleBuilder.simpleSchele().withIntervalInSeconds(1).repeatForever())
.build();
scheler.scheleJob(jobDetail , trigger);
Thread.sleep(5000);
// 刪除job
scheler.deleteJob(jobKey);
}
3.Spring 相關的任務調度
3.1 配置文件實現
spring-schele.xml
<task:scheler id="myScheler" pool-size="10" />
<task:scheled-tasks scheler="myScheler">
<task:scheled ref="job" method="test" cron="0 * * * * ?"/>
</task:scheled-tasks>
3.2註解實現
spring-schele.xml
<task:scheler id="myScheler" pool-size="10" />
// 啟用註解
<task:annotation-driven scheler="myScheler"/>
@Component
public class Task{
@Scheled(cron="0/5 * * * * ? ") //每5秒執行一次
public void execute(){
DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println(sdf.format(DateTime.now().toDate())+"*********B任務每5秒執行一次進入測試");
}
}
❹ 如何監控java quartz定時器中的所有定時任務
定時器的實現:
1、首先實現一個用於被執行的類,這個類用於被定時器調度,這個類不需要繼承任何類或者介面,代碼如下:
publicTestQuartz{
public void doSomething(){ //TODO } }
2、spring配置文件,具體配置
<!-- 被執行類 -->
<beanid="testQuarzt"class="test.testQuarzt"/>
<!-- 將testQuarzt注入到job中 -->
<beanid="testQuartzJob"class="org.springframework.scheling.quartz.">
<property name="targetObject" ref="testQuarzt" /> <property name="targetMethod" value="doSomething" /> <property name="concurrent" value="false" /> </bean>
<!-- 將job注入到定時觸發器 -->
<beanid="testTrigger"class="org.springframework.scheling.quartz.CronTriggerBean"> <property name="jobDetail" ref="testQuartzJob" /> <property name="cronExpression"> <value>0 0 6 * * ?<value> <property> <bean>
<!-- 將定時觸發器注入任務工程 -->
<beanclass="org.springframework.scheling.quartz.SchelerFactoryBean"> <property name="triggers"> <list>望採納,謝謝。
❺ 如何監控java quartz定時器中的所有定時任務
你好:
監控用
org.quartz.Scheler
//TriggerState:-1表示不存在,0表示正在運行,1表示暫停中
inttriggerState=scheler.getTriggerState(trigger.getTriggerName(),trigger.getTriggerGroup());
//啟動
scheler.scheleJob
//暫停
scheler.pauseTrigger
//移除
scheler.unscheleJob
具體的查一下API吧
❻ 有java高手么,用過定時器quartZ的,為什麼本地eclipse可以執行,放伺服器上就不執行
我估計是本地時間和伺服器時間不一致導致的。
當在本地eclipse運行時,伺服器在本地,假如定時器是要在五點做點什麼,
伺服器(也就是你本地了,也就是你電腦時間)到五點的時候,就開始運行,不會有偏差。
當你部署到別的地方時,當本地時間五點了,但是伺服器時間(就是部署代碼的那台電腦時間)才
四點五十九,所以就沒運行。