日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

Spring+Quartz(一)

發布時間:2025/3/8 javascript 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Spring+Quartz(一) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

2019獨角獸企業重金招聘Python工程師標準>>>

Quartz是一個非常優秀的任務調度引擎,詳情請見官網:http://www.quartz-scheduler.org/

而Spring很好地集成了Quartz,為企業級的任務調度提供了方便。

?

下面先看一個實現了Job接口的任務HelloWorldJob:

Java代碼

package com.springQuartz.example;

import java.util.Map;

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

public class HelloWorldJob implements Job{

?? ?@Override
?? ?public void execute(JobExecutionContext context) throws JobExecutionException {
?? ??? ?
?? ??? ?Map properties = context.getMergedJobDataMap();
?? ??? ?
?? ??? ?System.out.println("Hello World!");
?? ??? ?System.out.println("Previous Fire Time: "+context.getPreviousFireTime());//上次觸發任務的時間
?? ??? ?System.out.println("Current Fire Time: "+context.getFireTime());//當然觸發時間
?? ??? ?System.out.println("Next Fire Time: "+context.getNextFireTime());//下次觸發時間
?? ??? ?
?? ??? ?System.out.println(properties.get("message"));
?? ??? ?System.out.println();
?? ?}
?? ?
}

?

這個Job輸出"HelloWorld",同時輸出上次、本次及下次觸發的時間。

?

我們看一下在applicationContext.xml中的配置:

Xml代碼

<bean id="job" class="org.springframework.scheduling.quartz.JobDetailBean">
??? <property name="jobClass" value="com.springQuartz.example.HelloWorldJob"/>
?? ?<property name="jobDataAsMap">
?? ????? <map>
?? ???????? <entry key="triggerMessage" value="Job Message In JobDetail"/> <!--設置JobDetail中的值-->
?? ????? </map>
??? </property>
</bean>
?? ?
<bean id="trigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean">
??? <property name="jobDetail" ref="job"/> <!--觸發的job引用-->
??? <property name="startDelay" value="1000"/> <!--設置延遲1秒后運行-->
??? <property name="repeatInterval" value="10000"/> <!--設置每10秒觸發一次-->
??? <property name="jobDataAsMap">
?? ?????? <map>
?? ??? ?? <entry key="triggerMessage" value="Job Message From Trigger"/> <!--設置Trigger中的值-->
?? ?????? </map>
??? </property>
</bean>

<bean id="schedulerFactory" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
?? ?<property name="triggers">
?? ??? ?<list>
?? ??? ??? ?<ref local="trigger"/>?? ?
?? ??? ?</list>
?? ?</property>
</bean>

?

我們將HelloWorldJob實現成JobDetailBean類,并配置觸發器simpleTriggerBean

?

最后我們的測試類:

Java代碼

package com.springQuartz.test;

import org.springframework.beans.factory.BeanFactory;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Test {
?? ?public static void main(String args[]){
?? ??? ?BeanFactory factory = new ClassPathXmlApplicationContext("applicationContext.xml");
?? ?}
}

?

運行結果如下:

運行結果代碼

2011-01-16 20:48:18,437 INFO - Starting Quartz Scheduler now
Hello World!
Previous Fire Time: null
Current Fire Time: Sun Jan 16 20:48:19 CST 2011
Next Fire Time: Sun Jan 16 20:48:29 CST 2011
Job Message From Trigger

Hello World!
Previous Fire Time: Sun Jan 16 20:48:19 CST 2011
Current Fire Time: Sun Jan 16 20:48:29 CST 2011
Next Fire Time: Sun Jan 16 20:48:39 CST 2011
Job Message From Trigger

  • ?
  • 下面說明幾點:

    1)首次觸發是輸出的Previous Fire Time為null

    2)jobDataAsMap的說明:在HelloWorldJob.java中getMergedJobDataMap是JobDetail和 Trigger上的JobDataMap的合并,兩者數據如果沖突,則Trigger上的數據將覆蓋JobDetail中的。運行結果也證明了,我們在 Job中設置的值沒有輸出,而輸出了"Job Message From Trigger"。

    3)我們看到HelloWorldJob實現了Job接口,代碼上依賴了Quartz的接口

    ?

    下面我們討論另外一種更普遍的,去除接口依賴的實現

    ?

    主要的applicationContext.xml文件的配置

    Xml代碼

    <bean id="jobService" class="com.springQuartz.service.JobServiceImpl">
    </bean>
    ?? ?
    <bean id="invokeJob" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
    ?? ?<property name="targetObject">
    ?? ??? ?<ref bean="jobService" /> <!--目標Job-->
    ?? ?</property>
    ?? ?<property name="targetMethod">
    ?? ??? ?<value>JobServiceImpl中的特定方法</value> <!--目標方法-->
    ?? ?</property>
    ?? ?<property name="concurrent">
    ?? ??? ?<value>false</value> <!--設置是否同步-->
    ?? ?</property>
    </bean>
    ?? ?
    <bean id="jobServiceCronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
    ?? ?<property name="jobDetail" ref="invokeJob" />
    ?? ?<property name="cronExpression" value="5/10 * * * * ?" />
    </bean>

    <bean id="schedulerFactory" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
    ?? ?<property name="triggers">
    ?? ??? ?<list>
    ?? ??? ??? ?<ref local="jobServiceCronTrigger"/>
    ?? ??? ?</list>
    ?? ?</property>
    </bean>

    ?

    ?

    ?

    1)首先我們配置具體的Job信息--JobServiceImpl,這個類可以不實現Quartz中的Job接口

    2)最主要的MethodInvokingJobDetailFactoryBean,可以使得1)可行

    3)相對于上面的例子,我們使用CronTriggerBean實現trigger,實現更靈活的時間配置

    4)默認情況下,Quartz Jobs是無狀態的,可能導致jobs之間互相的影響。如果你為相同的JobDetail 指定兩個Trigger, 很可能當第一個job完成之前,第二個job就開始了。如果JobDetail 對象實現了Stateful 接口,就不會發生這樣的事情。 第二個job將不會在第一個job完成之前開始。為了使得jobs不并發運行,設置MethodInvokingJobDetailFactoryBean 中的concurrent 標記為false 。

    ?

    轉載于:https://my.oschina.net/u/2365087/blog/690264

    總結

    以上是生活随笔為你收集整理的Spring+Quartz(一)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。