最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java定時任務(wù)詳解

 更新時間:2017年04月27日 15:04:21   作者:wuzhiyuan  
定時任務(wù)在項目中經(jīng)常會使用到,本文主要根據(jù)博主自己使用定時的經(jīng)驗分如下幾點介紹定時任務(wù):1、Quartz定時任務(wù)簡介及Spring配置Quartz定時任務(wù);2、SchedulerFactory對定時任務(wù)進(jìn)行增刪改查

定時任務(wù)在項目中經(jīng)常會使用到,本文主要根據(jù)博主自己使用定時的經(jīng)驗分如下幾點介紹定時任務(wù):

1、Quartz定時任務(wù)簡介及Spring配置Quartz定時任務(wù)

2、SchedulerFactory對定時任務(wù)進(jìn)行增刪改查

3、總結(jié)

Quartz定時任務(wù)簡介:

Quartz是項目中經(jīng)常用到的定時任務(wù)之一,是一個完全由java編寫的開源作業(yè)調(diào)度框架,可以與J2EE與J2SE應(yīng)用程序相結(jié)合也可以單獨使用,其主要組成部分包括Job、Scheduler、CronExpression,這里就不一一介紹了,下面介紹Spring如何配置Quartz。

配置Quartz需要明白的一點是配置Quartz即配置Job、Scheduler和CronExpression,這三部分配置完成后,就是一個完整的定時任務(wù),配置如下:

<bean id= "TestJobDetail" class="org.springframework.scheduling.quartz.JobDetailBean"> 
  <property name="jobClass" value="xx.TestQuartzJob"/>
  <!-- 可以封裝各種數(shù)據(jù)到JobExecutionContext里,包括接口、類,其中testServiceImpl是Spring管理的Bean,需要什么聲明 --> 
  <property name="jobDataAsMap"> 
    <map> 
      <entry key="test" value="test"/>
      <entry key ="testServiceImpl" value-ref="testServiceImpl"/>
    </map> 
  </property> 
</bean>

<bean id= "TestTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean"> 
  <property name="jobDetail" ref="TestJobDetail" /> 
  <property name="cronExpression" value="0 0/1 * * * ?" />
</bean>

<bean id= "testSchedulerFactoryBean" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> 
  <property name="triggers" > 
    <list> 
      <ref bean="TestTrigger" /> 
    </list> 
  </property> 
</bean>
<bean id="testServiceImpl" class="xx.service.impl.TestServiceImpl">

配置完成后,就是增加一個為你執(zhí)行一個任務(wù)的Java類。每一個Quartz Job必須有一個 實現(xiàn)了org.quartz.Job接口的具體類,代碼如下:

public class TestQuartzJob extends QuartzJobBean {
  @Override
  protected void executeInternal(JobExecutionContext arg0) throws JobExecutionException
  {
    // 獲取Job配置的接口
    TestServiceImpl testServiceImpl = (TestServiceImpl) arg0.getJobDetail().getJobDataMap().get("testServiceImpl");
    // 執(zhí)行業(yè)務(wù)方法
    quartzStart();
  }
  public void quartzStart(){
    // 業(yè)務(wù)方法...
  }
}

當(dāng)然,在Job中其實不用特意的配置接口,使用Spring的注入即可,這里只是把這個配置接口的方法進(jìn)行說明。

到這里,簡單的配置Quartz定時任務(wù)已經(jīng)完成,下面附加一個我在項目中使用Quartz的情形:cronExpression表達(dá)式從數(shù)據(jù)庫讀取。

當(dāng)時,我解決這個問題的方法是繼承org.springframework.scheduling.quartz.CronTriggerBean,設(shè)置cronExpression,具體代碼如下:

Trigger的配置要改:

<bean id="TestTrigger" class="xx.InitCronTriggerFactoryBean">
  <property name="jobDetail" ref="TestJobDetail" />
  <property name="key" value="key" />
</bean>

xx.InitCronTriggerFactoryBean代碼:

public class InitCronTriggerFactoryBean extends CronTriggerFactoryBean implements Serializable {

  private static final long serialVersionUID = 1L;

  @Resource
  private SysParamService sysParamService;

  private String key;

  public void setKey(String key)
  {
    this.key = key;

    setCronExpression(getCronExpressionFromDB());
  }

  private String getCronExpressionFromDB()
  {
    if(StringUtils.isEmpty(key))
      return "0 0/5 * * * ?";

    SysParam sysParam = new SysParam();

    try
    {
      sysParam = sysParamService.getNameByKey(key);
    }
    catch (Exception e)
    {
      e.printStackTrace();
    }

    if(sysParam != null && !StringUtils.isEmpty(sysParam.getParamValue()))
      return sysParam.getParamValue();

    return "0 0/5 * * * ?";
  }
}

其中,SysParamService是根據(jù)key到數(shù)據(jù)庫查詢對應(yīng)的cronExpression表達(dá)式的接口,這個接口除了使用Spring注入,也可以使用set方法設(shè)置,如下:

<bean id="TestTrigger" class="xx.InitCronTriggerFactoryBean">
  <property name="jobDetail" ref="TestJobDetail" />
  <property name="key" value="key" />
  <property name="sysParamService" ref="sysParamService" />
</bean>
<bean id="sysParamService" class="xx.service.impl.SysParamServiceImpl">

這樣,在xx.InitCronTriggerFactoryBean就要加入sysParamService的set方法,此時的xx.InitCronTriggerFactoryBean代碼為:

public class InitCronTriggerFactoryBean extends CronTriggerFactoryBean implements Serializable {
  private static final long serialVersionUID = 1L;
  private SysParamServiceImpl sysParamService;
  private String key;
  public void setKey(String key)
  {
    this.key = key;
  }
  public void setSysParamService(SysParamServiceImpl sysParamService)
  {
    this.sysParamService = sysParamService;
    setCronExpression(getCronExpressionFromDB());
  }
  private String getCronExpressionFromDB()
  {
    if(StringUtils.isEmpty(key))
      return "0 0 0/1 * * ?";
    SysParam sysParam = new SysParam();
    try
    {
      sysParam = sysParamServiceImpl.getNameByKey(key);
    }
    catch (Exception e)
    {
      e.printStackTrace();
    }
    if(sysParam != null && !StringUtils.isEmpty(sysParam.getParamValue()))
      return sysParam.getParamValue();
    return "0 0 0/1 * * ?";
  }
}

Quartz定時任務(wù)到這里就差不多了,基本的配置和使用就是上面將的,想要深入了解Quartz可以在網(wǎng)上查找更多的資料,并在實踐中使用。接下來將講解在項目中使用的可以隨時對定時任務(wù)進(jìn)行增刪改查操作的實例。

定時任務(wù)的增刪改查,其實可以看做是對數(shù)據(jù)進(jìn)行增刪改查。不過,定時任務(wù)的增刪改查是操作Job和Trigger,具體代碼如下:

定時任務(wù)管理器代碼:

public class QuartzManager {

  private static final Logger logger = LogPresident.getRootLogger();

  private static SchedulerFactory schedulerFactory = new StdSchedulerFactory();

  private static Map<String, JobKey> jobKeyMap = new HashMap<String, JobKey>();

  /**
  * 增加一個定時任務(wù)
  * @author zhiyuan.wu
  * @date 2017年3月30日
  * @param jobName
  * @param triggerName
  * @param cls
  * @param date
  */
  @SuppressWarnings({ "rawtypes", "unchecked" })
  public static void addJob(String jobName, String triggerName, Class cls, Date date)
  {
    try
    {
      Scheduler scheduler = schedulerFactory.getScheduler();

      // job
      JobDetail jobDetail = JobBuilder.newJob(cls).withIdentity(jobName, Scheduler.DEFAULT_GROUP).build();

      // 觸發(fā)器
      SimpleTrigger trigger = (SimpleTrigger) TriggerBuilder.newTrigger().withIdentity(triggerName, Scheduler.DEFAULT_GROUP).startAt(date).build();

      scheduler.scheduleJob(jobDetail, trigger);

      // 啟動
      scheduler.start();

      jobKeyMap.put(jobDetail.getKey().getName(), jobDetail.getKey());
    }
    catch (Exception e)
    {
      logger.error("--------添加定時任務(wù)出錯:" + e.getMessage(), e);
    }
  }

/**
* 刪除對應(yīng)的定時任務(wù)
* @author zhiyuan.wu
* @date 2017年3月29日
* @param jobKey
*/
public static void removeJob(JobKey jobKey)
{
  Scheduler scheduler;
  try
  {
    scheduler = schedulerFactory.getScheduler();
    scheduler.deleteJob(jobKey);

      jobKeyMap.remove(jobKey.getName());
    }
    catch (SchedulerException e)
    {
      logger.error("--------刪除定時任務(wù)出錯:" + e.getMessage(), e);
    }
  }

/**
* 啟動所有定時任務(wù)
* @author zhiyuan.wu
* @date 2017年3月29日
*/
public static void startJobs()
{
  try
  {
    Scheduler sched = schedulerFactory.getScheduler();
    sched.start();
  }
  catch (Exception e)
  {
    logger.error("--------啟動所有定時任務(wù)出錯:" + e.getMessage(), e);
  }
}

/**
* 停止所有定時任務(wù)
* @author zhiyuan.wu
* @date 2017年3月29日
*/
public static void shutdownJobs()
{
  try
  {
    Scheduler sched = schedulerFactory.getScheduler();

    if (!sched.isShutdown())
    {
      sched.shutdown();
    }
  }
  catch (Exception e)
  {
    logger.error("--------停止所有定時任務(wù)出錯:" + e.getMessage(), e);
  }
}

/**
* 修改定時任務(wù)
* @author zhiyuan.wu
* @date 2017年3月29日
* @param jobKey
* @param jobName
* @param triggerName
* @param cls
* @param date
*/
@SuppressWarnings("rawtypes")
public static void modifyJobTime(JobKey jobKey, String jobName, String triggerName, Class cls, Date date)
{
  try
  {
    removeJob(jobKey);

    addJob(jobName, triggerName, cls, date);
  }
  catch (Exception e)
  {
    logger.error("--------修改定時任務(wù)出錯:" + e.getMessage(), e);
  }
}

/**
* 打印當(dāng)前定時任務(wù)的jobName
* @author zhiyuan.wu
* @date 2017年3月29日
* @throws SchedulerException
*/
public static void printJobName() throws SchedulerException
{
  for (String jobName : jobKeyMap.keySet())
  {
    logger.info("--------jobName:" + jobName);
  }
}
}

Job代碼:

public class TestJob implements Job {

  private static final Logger logger = LogPresident.getRootLogger();

  public void execute(JobExecutionContext context) throws JobExecutionException
  {
    JobKey jobKey = context.getJobDetail().getKey();

    logger.info("--------定時任務(wù)開始執(zhí)行:" + jobKey.getName());

    // 業(yè)務(wù)方法...
    // 移除定時任務(wù)
    QuartzManager.removeJob(jobKey);
  }
}

增加一個定時任務(wù)代碼:

QuartzManager.addJob(JobName, TriggerName , TestJob.class, Date);

這樣,在到達(dá)時間Date時,定時任務(wù)將會執(zhí)行。不過這樣增加的任務(wù)是保存在內(nèi)存中,項目重啟將會丟失定時任務(wù),所以,最好增加一個類,在項目啟動時將會掃描數(shù)據(jù)庫,將未執(zhí)行的定時任務(wù)重新加載到內(nèi)存中去。

定時任務(wù)在項目中運用需要根據(jù)業(yè)務(wù)具體調(diào)整,但只要弄清楚定時任務(wù)的原理和實現(xiàn),那么就可以在項目中靈活運它用來具體的業(yè)務(wù),希望這篇文章可以讓大家快速了解和運用定時任務(wù),并運用到實踐中。

以上就是本文的全部內(nèi)容,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助,同時也希望多多支持腳本之家!

相關(guān)文章

  • IDEA中如何使用注解Test

    IDEA中如何使用注解Test

    這篇文章主要介紹了IDEA中如何使用注解Test問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • 淺析java中next與nextLine用法對比

    淺析java中next與nextLine用法對比

    這篇文章主要介紹了java中next與nextLine用法區(qū)別以及實例分析了他們的區(qū)別,需要的朋友可以參考下
    2017-04-04
  • Java設(shè)計模式之模板方法模式Template Method Pattern詳解

    Java設(shè)計模式之模板方法模式Template Method Pattern詳解

    在我們實際開發(fā)中,如果一個方法極其復(fù)雜時,如果我們將所有的邏輯寫在一個方法中,那維護(hù)起來就很困難,要替換某些步驟時都要重新寫,這樣代碼的擴(kuò)展性就很差,當(dāng)遇到這種情況就要考慮今天的主角——模板方法模式
    2022-11-11
  • 基于Socket類以及ServerSocket類的實例講解

    基于Socket類以及ServerSocket類的實例講解

    下面小編就為大家?guī)硪黄赟ocket類以及ServerSocket類的實例講解。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-09-09
  • 如何讓Spring Rest 接口中路徑參數(shù)可選

    如何讓Spring Rest 接口中路徑參數(shù)可選

    這篇文章主要介紹了如何讓Spring Rest 接口中路徑參數(shù)可選,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • 為什么Java要把字符串設(shè)計成不可變的

    為什么Java要把字符串設(shè)計成不可變的

    為什么Java要把字符串設(shè)計成不可變的,這篇文章給出了Java字符串設(shè)計成不可變的原因,感興趣的小伙伴們可以參考一下
    2017-06-06
  • SpringBoot集成MybatisPlus報錯的解決方案

    SpringBoot集成MybatisPlus報錯的解決方案

    這篇文章主要介紹了SpringBoot集成MybatisPlus報錯的解決方案,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-12-12
  • JDBC環(huán)境設(shè)置(中文詳解)

    JDBC環(huán)境設(shè)置(中文詳解)

    要開始使用JDBC設(shè)置,按照以下所示的步驟開發(fā)JDBC環(huán)境。以下內(nèi)容假設(shè)Windows平臺上
    2014-03-03
  • 詳解如何在項目中應(yīng)用SpringSecurity權(quán)限控制

    詳解如何在項目中應(yīng)用SpringSecurity權(quán)限控制

    本文主要介紹了如何在項目中應(yīng)用SpringSecurity權(quán)限控制,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • Java利用DFA算法實現(xiàn)敏感詞管理

    Java利用DFA算法實現(xiàn)敏感詞管理

    我們在完成一些文章發(fā)布的功能是,可以使用第三方工具如阿里云的內(nèi)容安全來進(jìn)行文章的審核,但是這個第三方接口并不能過濾一些敏感詞,所以本文就來講講如何通過DFA算法就行敏感詞管理吧
    2024-11-11

最新評論

门源| 津市市| 汾阳市| 资阳市| 灵山县| 绍兴市| 大田县| 寿宁县| 吉林市| 民丰县| 阿坝县| 瑞金市| 九龙坡区| 乌兰县| 巴南区| 隆安县| 遵化市| 沾益县| 昌邑市| 花莲县| 慈溪市| 惠州市| 墨脱县| 绥芬河市| 沙湾县| 鄂伦春自治旗| 莎车县| 德庆县| 大竹县| 广元市| 怀远县| 德清县| 黄山市| 乾安县| 海宁市| 府谷县| 伊吾县| 黔东| 永济市| 平果县| 子洲县|